Odvolanie a odhlásenie
use RoundlyConsulting\RefreshTokens\Enums\RevocationReason;
RefreshTokens::revoke($plainFromClient); // logout with token in hand; bool, idempotent
RefreshTokens::sessions($user)->revokeAll(); // global logout — returns count revoked
RefreshTokens::sessions($user)->revokeAll(RevocationReason::CredentialsChanged);
RefreshTokens::session($row)->revoke(); // one row you hold (reason defaults to Manual)RefreshTokens::revoke() prijíma plaintext (dôvod predvolene Logout). Vráti true, ak ukončil živú reláciu, a false pre neznámy token alebo token, ktorého relácia sa už skončila — opakované volanie je teda bezpečné. Riadok, ktorý už máte, odvoláte cez session($row)->revoke() (dôvod predvolene Manual):
RefreshTokens::session($row)->revoke(); // the model or its key — reason Manual
RefreshTokens::session($row)->revoke(RevocationReason::Security); // every verb takes an explicit reason
RefreshTokens::revoke($plainFromClient, RevocationReason::Security);Odhlásenie už rotovaným tokenom
Aj použitý token reláciu ukončí. Reláciu už nedrží — tá žije ďalej v riadku, do ktorého bol rotovaný — takže odvolanie samotného použitého riadku by tomu, kto ho rotoval, dovolilo obnovovať ďalej. Preto:
$a = RefreshTokens::issue($user, new IssueContext(accessReference: 'acc-a'));
RefreshTokens::rotate($a->plainText, new RotationContext(accessReference: 'acc-b'));
// The client logs out with the token it held before the rotation:
RefreshTokens::revoke($a->plainText); // true — outside rotation.grace the whole family is revoked
// as ReuseDetected and RefreshTokenReuseDetected fires- Mimo rotation.grace je použitý token signál krádeže a spracuje sa presne ako opakované predloženie pri redeem(): celá rodina sa odvolá s dôvodom ReuseDetected, každý živý odkaz na prístupový token sa zneplatní, spustí sa RefreshTokenReuseDetected a revoke() vráti true. Zadaný dôvod sa nepoužije — riadky zaznamenajú skutočnú príčinu.
- V rámci rotation.grace (vlastná obnova klienta v súbehu s jeho odhlásením) sa živé riadky rodiny odvolajú s vaším dôvodom, pre každý sa spustí SessionRevoked a udalosť o opätovnom použití sa nespustí.
- Relácia zachytená uprostred rotácie sa v oboch prípadoch uzavrie, takže rozpracovaná náhrada sa odmietne.
Každé odvolanie uloží revoked_reason, zavolá zaregistrovaný AccessTokenRevoker raz pre každý živý odkaz na prístupový token a spustí SessionRevoked.
Dôvody odvolania
Každá metóda odvolania prijíma voliteľný RevocationReason, ktorý sa uloží do revoked_reason a prenesie v udalosti SessionRevoked:
| Prípad | Hodnota | Kedy |
|---|---|---|
Rotated | rotated | Nahradený rotáciou. |
Logout | logout | Výslovné odhlásenie jednej relácie. |
LogoutAll | logout_all | Globálne odhlásenie / odvolanie všetkého. |
ReuseDetected | reuse_detected | Odvolanie rodiny pri signáli krádeže. |
Expired | expired | Odstránený po expirácii. |
Manual | manual | Odvolanie administrátorom alebo aplikáciou. |
CredentialsChanged | credentials_changed | Zmena hesla, 2FA alebo passkey. |
AccountDisabled | account_disabled | Vlastník deaktivovaný alebo zmazaný. |
SessionLimit | session_limit | Vytlačená limitom relácií na vlastníka. |
Security | security | Akákoľvek iná bezpečnostná reakcia. |
Odhlásenie všade pri zmene hesla
Štandardnou reakciou na zmenu prihlasovacích údajov je odvolanie všetkých relácií. Napojte ho vo flow zmeny hesla alebo cez observer modelu — balík metódu poskytuje, no do vášho modelu User sa sám nenapája:
// In a change-password action:
$user->update(['password' => Hash::make($newPassword)]);
$user->revokeAllSessions(RevocationReason::CredentialsChanged);
// …or via a saved observer:
User::saved(function (User $user): void {
if ($user->wasChanged('password')) {
$user->revokeAllSessions(RevocationReason::CredentialsChanged);
}
});Obnova odhlásenie nepredbehne
Relácia odvolaná uprostred rotácie — token už je uplatnený, náhrada ešte nie je vydaná — v tom okamihu nemá aktívny riadok. Metódy relácií (sessions()->revokeAll(), revokeOthers(), revokeAllExcept(), revoke()) takú reláciu tiež uzavrú: uplatnenému riadku nastavia dôvod, zneplatnia jeho odkaz na prístupový token a spustia SessionRevoked. Rozpracovaná náhrada sa potom odmietne — rotate() vráti null, výslovné issue() vyhodí InvalidTokenFamilyException alebo sa vráti už odvolané.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.