Vydávanie používateľských tokenov
Používateľské tokeny sú RS256 JWT podpísané na vydávajúcej aplikácii privátnym RSA kľúčom. Vydavateľ pripne iss, aud, sub, iat, nbf, exp, jti a scope — tieto vždy prepíšu rovnomenný claim od volajúceho, takže doplnkové claimy nikdy nepodvrhnú identitu.
Prístupové tokeny
AccessTokenRequest je nemenný fluentný builder — každá metóda vracia novú inštanciu. Výsledný token má scope = access:
use RoundlyConsulting\Jwt\Facades\Jwt;
use RoundlyConsulting\Jwt\UserTokens\AccessTokenRequest;
$request = AccessTokenRequest::for($user->id) // subject (string|int)
->email($user->email, verified: $user->hasVerifiedEmail()) // email + email_verified claims
->tokenVersion($user->token_version) // tv claim (freshness)
->permissions('posts.view', 'posts.edit') // permissions claim
->withClaims(['org' => 42]); // arbitrary extra claims
$issued = Jwt::mintAccessToken($request);- for($subject) — claim sub; prijme reťazec aj int.
- email($email, verified: bool) — claimy email a email_verified.
- tokenVersion(int) — claim tv, ktorý porovnáva kontrola verzie tokenu v guarde.
- permissions(...$abilities) — claim permissions pre autorizáciu z claimov.
- withClaims(array) — ľubovoľné doplnkové claimy; registrované a známe claimy majú vždy prednosť.
Vrátenie tokenu
Každé vydanie vracia readonly objekt IssuedToken:
$issued->token; // string — the compact JWS to return to the client
$issued->expiresAt; // CarbonImmutable — the expiry
$issued->jti; // string — the token id (store it to denylist later)
return response()->json([
'access_token' => $issued->token,
'token_type' => 'Bearer',
'expires_at' => $issued->expiresAt->toIso8601String(),
]);Audience, platnosť a claimy relácie
audience() a ttl() riadia vydavateľa a do payloadu sa nikdy nezapíšu. sid, amr a auth_time sa pridajú len vtedy, keď ich nastavíte, takže existujúci kód vydáva presne to isté ako doteraz:
AccessTokenRequest::for($user->id)
->audience('app-clients') // aud — defaults to jwt.audience
->ttl(600) // seconds — defaults to jwt.ttl
->sessionId($familyId) // sid
->authMethods('pwd', 'otp', 'mfa') // amr (RFC 8176)
->authTime($loggedInAt); // auth_time — int or any DateTimeInterface
$claims->sessionId(); // ?string
$claims->authMethods(); // list<string>, [] when absent
$claims->authTime(); // ?intttl() pod jednu sekundu, prázdne sessionId() a prázdne alebo chýbajúce authMethods() vyhodia InvalidArgumentException. amr sa deduplikuje, platí prvý výskyt.
Challenge, overenie e-mailu a vlastné scope
Tokeny 2fa_pending a email_verify použijú nastavené challenge_ttl a verify_ttl — číslo nemusíte odovzdávať ručne:
Jwt::mintChallengeToken($subject); // scope=2fa_pending, exp = challenge_ttl
Jwt::mintEmailVerifyToken($subject, $user->email); // scope=email_verify, exp = verify_ttl
// Extra claims on a challenge token:
Jwt::mintChallengeToken($subject, ['method' => 'totp']);
// Any other scope via the generic mint():
Jwt::mint($subject, 'my_custom_scope', ttl: 120, extraClaims: ['org' => 42]);Enum Scope
Štyri vstavané scope sú backed enum. mint() prijme prípad Scope aj ľubovoľný reťazec, takže vlastné scope zostávajú voľnými reťazcami:
use RoundlyConsulting\Jwt\UserTokens\Scope;
Scope::Access->value; // 'access'
Scope::TwoFaPending->value; // '2fa_pending'
Scope::EmailVerify->value; // 'email_verify'
Scope::Service->value; // 'service'
Jwt::mint($subject, Scope::Access, ttl: 900); // pass an enum case, or any string
Scope::values(); // Collection: ['access', '2fa_pending', …]Bez fasády
Uprednostnite fasádu. Na pozadí deleguje na kontrakt UserTokenIssuer (naviazaný na NativeUserTokenIssuer), ktorý môžete získať aj priamo — pozrite DI a akcie:
use RoundlyConsulting\Jwt\UserTokens\AccessTokenRequest;
use RoundlyConsulting\Jwt\UserTokens\Contracts\UserTokenIssuer;
$issued = app(UserTokenIssuer::class)->mintAccessToken(
AccessTokenRequest::for($user->id)->email($user->email, verified: true)
);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.