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

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ľúčEnvPredvolenéÚčel
private_key_pathJWT_PRIVATE_KEY_PATHstorage_path('jwt-private.key')Cesta k privátnemu RSA kľúču — číta sa len pri vydávaní (vydávajúce aplikácie).
public_key_pathJWT_PUBLIC_KEY_PATHstorage_path('jwt-public.pem')Cesta k verejnému RSA kľúču na overovanie tokenov.
issuerJWT_ISSUERnullPripnutý iss — povinný; nenastavený (null alebo prázdny) vyhodí JwtMisconfigured.
audienceJWT_AUDIENCEnullPripnutý aud — povinný; nenastavený (null alebo prázdny) vyhodí JwtMisconfigured. Predvolený pre každý jwt guard.
ttlJWT_TTL900Platnosť prístupového tokenu v sekundách, aspoň 1.
challenge_ttlJWT_CHALLENGE_TTL300Platnosť tokenu 2fa_pending v sekundách, aspoň 1.
verify_ttlJWT_VERIFY_TTL3600Platnosť tokenu email_verify v sekundách, aspoň 1.
leewayJWT_LEEWAY10Tolerancia posunu hodín v sekundách pre používateľské aj servisné tokeny, 0 alebo viac.
kidJWT_KIDnullAk je nastavený, pridá hlavičku kid — len metadáta, kľúč sa podľa neho nevyberá. Prázdna hodnota sa berie ako nenastavená.
guard.scope—accessScope, ktorý musí token niesť, aby prešiel cez jwt guard.
guard.identity—TokenUser::classTrieda identity v claims režime; musí implementovať ClaimsAuthenticatable, inak JwtMisconfigured.
guard.token_version—nullInvokable trieda alebo closure s aktuálnou verziou používateľa, porovnáva sa s tv.
guard.check_denylistJWT_CHECK_DENYLISTtrueKontrolovať 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.storeJWT_DENYLIST_STOREredisCache store pre denylist; nenastavená hodnota (null alebo prázdna) použije predvolený store.
denylist.prefixJWT_DENYLIST_PREFIXjwt:denylist:Prefix kľúčov denylistu v cache; prázdna hodnota sa počíta ako nenastavená, takže platí jwt:denylist:.
service.secretSERVICE_JWT_SECRETnullZdieľané HS256 tajomstvo, aspoň 32 náhodných bajtov.
service.secretsSERVICE_JWT_SECRETSnullTajomstvá pre jednotlivé služby „billing:<secret>,api:<secret>“; prebijú secret. Chybná dvojica vyhodí JwtMisconfigured.
service.nameJWT_SERVICE_NAMEapp.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.issuerJWT_SERVICE_ISSUERenv('APP_SERVICE'), inak service.nameiss servisných tokenov, ktoré táto aplikácia vydáva.
service.audienceJWT_SERVICE_AUDIENCEnullPredvolený aud, keď issue() nedostane audience.
service.ttlSERVICE_JWT_TTL60Platnosť servisného tokenu v sekundách, aspoň 1.
service.issuersJWT_SERVICE_ISSUERS[] (ľubovoľný)Zoznam povolených vydavateľov oddelený čiarkami.
authorize_from_claimsJWT_AUTHORIZE_FROM_CLAIMSfalseZaregistrovať 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 48

Nastavenia 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 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.