NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Refresh Tokens for Laravel

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ípadHodnotaKedy
RotatedrotatedNahradený rotáciou.
LogoutlogoutVýslovné odhlásenie jednej relácie.
LogoutAlllogout_allGlobálne odhlásenie / odvolanie všetkého.
ReuseDetectedreuse_detectedOdvolanie rodiny pri signáli krádeže.
ExpiredexpiredOdstránený po expirácii.
ManualmanualOdvolanie administrátorom alebo aplikáciou.
CredentialsChangedcredentials_changedZmena hesla, 2FA alebo passkey.
AccountDisabledaccount_disabledVlastník deaktivovaný alebo zmazaný.
SessionLimitsession_limitVytlačená limitom relácií na vlastníka.
SecuritysecurityAká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 kryptomien

Odoslaní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.