Tokeny a relácie
Prístupové tokeny sú RS256 používateľské tokeny z jwt-for-laravel; refresh tokeny sú rotujúce rodiny z refresh-tokens-for-laravel, jedna rodina na reláciu zariadenia.
Claimy prístupového tokenu
| Claim | Zdroj |
|---|---|
iss, iat, nbf, exp, jti, scope | jwt |
aud | JWT audience guardu — hranica izolácie. |
sub | Kľúč účtu. |
tv | Account::tokenVersion(). |
email, email_verified, permissions, extra | ResolvesAccessTokenClaims guardu (predvolene e-mail podľa tokens.include_email, bez oprávnení). |
sid | Id rodiny refresh tokenov = id relácie. |
amr | Metódy podľa RFC 8176 nazbierané počas prihlásenia (pri prázdnom zozname vynechané). |
auth_time | Kedy uspel prvý faktor (zachováva sa pri obnove). |
grd | Názov guardu (diagnostika). |
Obnova a relácie
use RoundlyConsulting\Auth\Facades\Authentication;
$guard = Authentication::guard('users');
$context = $guard->contextFrom($request);
$current = $guard->tokenFrom($request); // jti, sid, auth_time, amr
$pair = $guard->refresh($refreshToken, $context); // rotates within the same session; the previous access token stops working
$guard->sessions($user, $current->sessionId); // Collection<SessionData>, current flagged
$guard->logout($user, $current); // this device
$guard->logoutSession($user, $sessionId); // one device
$revoked = $guard->logoutOthers($user, $current); // every other device
$revoked = $guard->logoutEverywhere($user); // tv++ and every sessionObnova je obmedzená podľa IP. Úspešná obnova zneplatní predošlý prístupový token relácie, takže relácia má vždy len jeden platný prístupový token a jej zrušenie zneplatní všetky tokeny, ktoré kedy vydala — aj skopírovaný starší. Token iného guardu je neznámy a nespotrebuje sa; deaktivovanému vlastníkovi sa rodina zruší. Opätovné použitie už zrotovaného tokenu zruší celú rodinu, spustí RefreshTokenReuseReported a vlastníkovi pošle upozornenie na podozrivú reláciu.
| Operácia | Účinok | Udalosť |
|---|---|---|
| logout | Zakáže aktuálne jti do jeho expirácie a zruší reláciu. | LoggedOut(Current) |
| logoutSession | Zruší jednu reláciu; neznáme či cudzie id vráti 404. | LoggedOut(Session) |
| logoutOthers | Zruší všetky ostatné relácie bez zvýšenia tv (to by odhlásilo aj volajúceho); jediný platný prístupový token každej zrušenej relácie sa zakáže. | LoggedOut(Others) |
| logoutEverywhere | tv++ a zrušenie všetkých relácií. | LoggedOut(Everywhere) + AccountTokensInvalidated |
| sessions.max_active | Nad limitom sa zrušia najstaršie relácie. | LoggedOut(Session) |
Invalidácia
Každá zmena prihlasovacích údajov použije rozsah guardu pre daný dôvod: none neurobí nič; others zvýši tv, zruší všetky relácie a zariadeniu, ktoré zmenu vykonalo, vydá nový pár; all zvýši tv a zruší všetky relácie. Každý rozsah iný ako none zneplatní aj aktívne výzvy a prihlasovacie jednorazové tokeny účtu.
| Spúšťač | Dôvod | Predvolený rozsah |
|---|---|---|
| Zmena hesla | password_changed | others |
| Obnova hesla | password_reset | all |
| Potvrdená zmena e-mailu | email_changed | others |
| Zapnutie / vypnutie 2FA / nové záložné kódy | two_factor_changed | others |
| Pridanie / odstránenie passkey | passkey_changed | none |
| Deaktivácia účtu | account_disabled | all (pevné) |
| Odhlásenie všade / incident | logout / security | all (pevné) |
Odpovede na zmenu prihlasovacích údajov obsahujú tokens (alebo null). Ak nie je null, klient musí okamžite prejsť na nový pár — jeho predošlý prístupový token so zmenou zanikol.
Konfigurácia
'tokens' => [
'access_ttl' => null, // seconds; null → jwt.ttl
'refresh_ttl' => 2_592_000, // sliding, 30 days
'refresh_absolute_ttl' => 7_776_000, // 90 days; 0 = no cap
'claims_resolver' => DefaultClaimsResolver::class,
'include_email' => true,
],
'sessions' => [
'max_active' => null, // int|null — oldest sessions revoked above the cap
],
'invalidation' => [ // none|others|all (account_disabled is always all)
'password_changed' => 'others',
'password_reset' => 'all',
'email_changed' => 'others',
'two_factor_changed' => 'others',
'passkey_changed' => 'none',
],Denylist jti je v cache: jej vyprázdnenie oživí zrušené prístupové tokeny až do ich expirácie. access_ttl držte krátke (najviac 15 minút); invalidácie pokryje verzia tokenu.
Vlastné claimy
Naviažte vlastný ResolvesAccessTokenClaims a vložte do prístupového tokenu oprávnenia či údaje tenanta:
use RoundlyConsulting\Auth\Contracts\Account;
use RoundlyConsulting\Auth\Contracts\ResolvesAccessTokenClaims;
use RoundlyConsulting\Auth\DataTransferObjects\AccessTokenClaims;
use RoundlyConsulting\Auth\Guards\GuardConfig;
// config: 'guards' => ['users' => ['tokens' => ['claims_resolver' => PermissionsClaims::class]]]
final class PermissionsClaims implements ResolvesAccessTokenClaims
{
public function resolve(Account $account, GuardConfig $guard): AccessTokenClaims
{
return new AccessTokenClaims(
email: $account->accountEmail(),
emailVerified: $account->hasVerifiedEmail(),
permissions: $account->permissions()->pluck('name')->all(),
extra: ['tenant' => $account->tenant_id],
);
}
}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.