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

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

ClaimZdroj
iss, iat, nbf, exp, jti, scopejwt
audJWT audience guardu — hranica izolácie.
subKľúč účtu.
tvAccount::tokenVersion().
email, email_verified, permissions, extraResolvesAccessTokenClaims guardu (predvolene e-mail podľa tokens.include_email, bez oprávnení).
sidId rodiny refresh tokenov = id relácie.
amrMetódy podľa RFC 8176 nazbierané počas prihlásenia (pri prázdnom zozname vynechané).
auth_timeKedy uspel prvý faktor (zachováva sa pri obnove).
grdNá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 session

Obnova 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ÚčinokUdalosť
logoutZakáže aktuálne jti do jeho expirácie a zruší reláciu.LoggedOut(Current)
logoutSessionZruší jednu reláciu; neznáme či cudzie id vráti 404.LoggedOut(Session)
logoutOthersZruší 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)
logoutEverywheretv++ a zrušenie všetkých relácií.LoggedOut(Everywhere) + AccountTokensInvalidated
sessions.max_activeNad 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ôvodPredvolený rozsah
Zmena heslapassword_changedothers
Obnova heslapassword_resetall
Potvrdená zmena e-mailuemail_changedothers
Zapnutie / vypnutie 2FA / nové záložné kódytwo_factor_changedothers
Pridanie / odstránenie passkeypasskey_changednone
Deaktivácia účtuaccount_disabledall (pevné)
Odhlásenie všade / incidentlogout / securityall (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 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.