---
title: "Konfigurácia — JWT for Laravel | Roundly"
description: "Každý kľúč config/jwt.php s env premennou a predvolenou hodnotou — kľúče, piny, platnosti, guardy, denylist a servisné tokeny."
url: https://roundly-consulting.com/sk/open-source/navody/jwt-for-laravel/konfiguracia
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[JWT for Laravel](https://roundly-consulting.com/sk/open-source/navody/jwt-for-laravel.md)

# 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:

```php
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 alebo dvakrát uvedený vydavateľ vyhodí JwtMisconfigured — bez vypísania tajomstva. |
| `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ý. Nereťazcové service.secret či service.secrets — pole alebo int zapísané do publikovaného konfiguračného súboru — chybová správa opíše len typom („must be a string or null, array given“), nikdy hodnotou, a hodnota sa nedostane ani medzi argumenty volaní v stack trace.

## 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:

```bash
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

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

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/jwt-for-laravel.md)
