Konfigurácia
Publikovaný config/jwt.php je celý riadený cez env a na overovanie funguje bez ďalšej konfigurácie, len čo nastavíte kľúče či tajomstvo. Celý súbor:
use RoundlyConsulting\Jwt\UserTokens\TokenUser;
return [
// Every value is read strictly: a key that is not set (absent, null or blank —
// `KEY=`) takes its default, but a present value of the wrong shape (a TTL of 'five', a non-list `issuers`, a malformed
// `secrets` pair, an `identity` that is not a ClaimsAuthenticatable) throws
// JwtMisconfigured naming the key instead of silently falling back.
// ── User tokens (RS256) ──────────────────────────────────────────────
// `jwt:generate-keys` writes both. Only minting reads the private key, so a
// verify-only app just never creates it. `.key` because a stock Laravel
// `.gitignore` already excludes `/storage/*.key`.
'private_key_path' => env('JWT_PRIVATE_KEY_PATH', storage_path('jwt-private.key')),
'public_key_path' => env('JWT_PUBLIC_KEY_PATH', storage_path('jwt-public.pem')),
'issuer' => env('JWT_ISSUER'), // required: minting/verifying throws when not set (null/blank)
'audience' => env('JWT_AUDIENCE'), // required: minting/verifying throws when not set (null/blank)
'ttl' => env('JWT_TTL', 900), // access token seconds (≥1)
'challenge_ttl' => env('JWT_CHALLENGE_TTL', 300), // 2fa_pending (≥1)
'verify_ttl' => env('JWT_VERIFY_TTL', 3600), // email_verify (≥1)
'leeway' => env('JWT_LEEWAY', 10), // clock-skew seconds (≥0)
'kid' => env('JWT_KID'), // emit-only metadata when set
// ── User guard ──────────────────────────────────────────────────────
// Defaults for every `jwt` guard. With several jwt guards (e.g. `users`
// and `clients`), each `auth.guards.<name>` array may override `audience`,
// `scope`, `token_version`, `check_denylist` and `identity`; give each
// guard its own `audience`, or one guard's tokens authenticate on another.
'guard' => [
'scope' => 'access', // required scope to authenticate
'identity' => TokenUser::class, // claims-mode identity class
'token_version' => null, // invokable-class|callable|null: fn(Authenticatable): int (closures break config:cache)
'check_denylist' => env('JWT_CHECK_DENYLIST', true),
],
// ── jti denylist ────────────────────────────────────────────────────
'denylist' => [
'store' => env('JWT_DENYLIST_STORE', 'redis'),
'prefix' => env('JWT_DENYLIST_PREFIX', 'jwt:denylist:'),
],
// ── Service tokens (HS256) ──────────────────────────────────────────
'service' => [
// Shared-secret mode: one ≥32-byte secret for the whole mesh
// (`openssl rand -base64 48`). Any holder can then claim any `iss`.
'secret' => env('SERVICE_JWT_SECRET'),
// Per-issuer mode (recommended): "billing:<secret>,api:<secret>".
// Binds each `iss` to its own secret; overrides `secret` when set.
'secrets' => env('SERVICE_JWT_SECRETS'),
// This service's own name: the `aud` every inbound service token must carry
// (and the default `iss` below). Set it explicitly to a STABLE identifier —
// unset, it falls back to a host's `app.service`, then to a slug of
// `app.name`, which can change and silently re-pin every caller.
'name' => env('JWT_SERVICE_NAME'),
'issuer' => env('JWT_SERVICE_ISSUER', env('APP_SERVICE')), // unset ⇒ the service name
'audience' => env('JWT_SERVICE_AUDIENCE'),
'ttl' => env('SERVICE_JWT_TTL', 60), // seconds (≥1)
'issuers' => array_values(array_filter(array_map('trim', explode(',', (string) env('JWT_SERVICE_ISSUERS', ''))))), // allow-list; empty ⇒ any
],
// ── Claim-based authorization ───────────────────────────────────────
'authorize_from_claims' => env('JWT_AUTHORIZE_FROM_CLAIMS', false),
];Všetky kľúče
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
private_key_path | JWT_PRIVATE_KEY_PATH | storage_path('jwt-private.key') | Cesta k privátnemu RSA kľúču — číta sa len pri vydávaní (vydávajúce aplikácie). |
public_key_path | JWT_PUBLIC_KEY_PATH | storage_path('jwt-public.pem') | Cesta k verejnému RSA kľúču na overovanie tokenov. |
issuer | JWT_ISSUER | null | Pripnutý iss — povinný; nenastavený (null alebo prázdny) vyhodí JwtMisconfigured. |
audience | JWT_AUDIENCE | null | Pripnutý aud — povinný; nenastavený (null alebo prázdny) vyhodí JwtMisconfigured. Predvolený pre každý jwt guard. |
ttl | JWT_TTL | 900 | Platnosť prístupového tokenu v sekundách, aspoň 1. |
challenge_ttl | JWT_CHALLENGE_TTL | 300 | Platnosť tokenu 2fa_pending v sekundách, aspoň 1. |
verify_ttl | JWT_VERIFY_TTL | 3600 | Platnosť tokenu email_verify v sekundách, aspoň 1. |
leeway | JWT_LEEWAY | 10 | Tolerancia posunu hodín v sekundách pre používateľské aj servisné tokeny, 0 alebo viac. |
kid | JWT_KID | null | Ak je nastavený, pridá hlavičku kid — len metadáta, kľúč sa podľa neho nevyberá. Prázdna hodnota sa berie ako nenastavená. |
guard.scope | — | access | Scope, ktorý musí token niesť, aby prešiel cez jwt guard. |
guard.identity | — | TokenUser::class | Trieda identity v claims režime; musí implementovať ClaimsAuthenticatable, inak JwtMisconfigured. |
guard.token_version | — | null | Invokable trieda alebo closure s aktuálnou verziou používateľa, porovnáva sa s tv. |
guard.check_denylist | JWT_CHECK_DENYLIST | true | Kontrolovať jti denylist na jwt guardoch (prepínač zap./vyp.). Prázdne JWT_CHECK_DENYLIST= sa počíta ako nenastavené, takže denylist zostane vynútený. |
denylist.store | JWT_DENYLIST_STORE | redis | Cache store pre denylist; nenastavená hodnota (null alebo prázdna) použije predvolený store. |
denylist.prefix | JWT_DENYLIST_PREFIX | jwt:denylist: | Prefix kľúčov denylistu v cache; prázdna hodnota sa počíta ako nenastavená, takže platí jwt:denylist:. |
service.secret | SERVICE_JWT_SECRET | null | Zdieľané HS256 tajomstvo, aspoň 32 náhodných bajtov. |
service.secrets | SERVICE_JWT_SECRETS | null | Tajomstvá pre jednotlivé služby „billing:<secret>,api:<secret>“; prebijú secret. Chybná dvojica vyhodí JwtMisconfigured. |
service.name | JWT_SERVICE_NAME | app.service, inak Str::slug(app.name) | Vlastný názov tejto služby — aud, ktorý musia niesť prichádzajúce servisné tokeny. Nastavte stabilný identifikátor; názov aplikácie sa môže zmeniť. |
service.issuer | JWT_SERVICE_ISSUER | env('APP_SERVICE'), inak service.name | iss servisných tokenov, ktoré táto aplikácia vydáva. |
service.audience | JWT_SERVICE_AUDIENCE | null | Predvolený aud, keď issue() nedostane audience. |
service.ttl | SERVICE_JWT_TTL | 60 | Platnosť servisného tokenu v sekundách, aspoň 1. |
service.issuers | JWT_SERVICE_ISSUERS | [] (ľubovoľný) | Zoznam povolených vydavateľov oddelený čiarkami. |
authorize_from_claims | JWT_AUTHORIZE_FROM_CLAIMS | false | Zaregistrovať Gate::before hook pre autorizáciu z claimov (prepínač zap./vyp.). |
Prísne hodnoty
Dva prepínače — guard.check_denylist a authorize_from_claims — prijímajú true/false, 1/0, on/off a yes/no bez ohľadu na veľkosť písmen. Nenastavená hodnota — chýbajúca, null alebo prázdna ('', čo dá KEY= v .env) — znamená predvolenú hodnotu, takže prázdne JWT_CHECK_DENYLIST= denylist ponechá zapnutý; čokoľvek iné, napríklad JWT_AUTHORIZE_FROM_CLAIMS=disabled, vyhodí JwtMisconfigured s názvom kľúča, namiesto aby sa potichu prečítalo ako zapnuté či vypnuté.
Rovnako prísne sa číta každá ďalšia hodnota a nenastavený kľúč (chýbajúci, null alebo prázdny) použije predvolenú hodnotu. TTL a leeway prijímajú int alebo kanonický celočíselný reťazec, takže JWT_TTL=five, '1.5' či 0 vyhodí JwtMisconfigured, namiesto aby vznikol token s platnosťou 0 sekúnd. Výnimku vyhodí aj nereťazcová cesta, kid, store, prefix či tajomstvo, service.issuers, ktoré nie je zoznam reťazcov, chybná dvojica v service.secrets a guard.identity, ktoré nie je ClaimsAuthenticatable — žiadna z týchto hodnôt potichu nerozšíri, čo balík prijme. Prázdny voliteľný reťazec (JWT_KID=) sa počíta ako nenastavený.
Tajomstvá pre služby
HS256 tajomstvo musí mať aspoň 32 náhodných bajtov — kratšia hodnota, jeden opakovaný bajt alebo kľúč vo formáte PEM vyhodí ServiceAuthMisconfigured. Vygenerujte ho príkazom:
openssl rand -base64 48Nastavenia pre jednotlivé guardy
Kľúče guard.* a audience sú predvolené hodnoty pre každý jwt guard. Každý guard si môže vo vlastnom poli auth.guards.<name> prepísať audience, scope, token_version, check_denylist a identity — pozrite časť Viacero guardov.
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.