---
title: "Tokeny a relácie — Auth for Laravel | Roundly"
description: "RS256 prístupové tokeny a ich claimy, rotujúce refresh tokeny, relácie zariadení, odhlásenia a pravidlá invalidácie."
url: https://roundly-consulting.com/sk/open-source/navody/auth-for-laravel/tokeny-a-relacie
language: sk
---

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

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

# 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

| Claim | Zdroj |
| --- | --- |
| `iss, iat, nbf, exp, jti, scope` | jwt |
| `aud` | JWT audience guardu — hranica izolácie. |
| `sub` | Kľúč účtu. |
| `tv` | Account::tokenVersion(). |
| `email, email_verified, permissions, extra` | ResolvesAccessTokenClaims guardu (predvolene e-mail podľa tokens.include\_email, bez oprávnení). |
| `sid` | Id rodiny refresh tokenov = id relácie. |
| `amr` | Metódy podľa RFC 8176 nazbierané počas prihlásenia (pri prázdnom zozname vynechané). |
| `auth_time` | Kedy uspel prvý faktor (zachováva sa pri obnove). |
| `grd` | Názov guardu (diagnostika). |

## Obnova a relácie

```php
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ší. Každá relácia si pamätá verziu tokenu, pod ktorou vznikla: obnova relácie, ktorú účet medzitým predbehol — prihlásenie v súbehu s obnovou hesla, deaktiváciou či odhlásením všade —, ju zruší a odpovie refresh\_invalid (relácie vydané verziou 1.1.0 alebo staršou verziu nenesú a nekontrolujú sa). 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 | Účinok | Udalosť |
| --- | --- | --- |
| logout | Zakáže aktuálne jti do jeho expirácie a zruší reláciu. | LoggedOut(Current) |
| logoutSession | Zruší jednu reláciu; neznáme či cudzie id vráti 404. | LoggedOut(Session) |
| logoutOthers | Zruší 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) |
| logoutEverywhere | tv++ a zrušenie všetkých relácií. | LoggedOut(Everywhere) + AccountTokensInvalidated |
| sessions.max\_active | Nad 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ôvod | Predvolený rozsah |
| --- | --- | --- |
| Zmena hesla | `password_changed` | others |
| Obnova hesla | `password_reset` | all |
| Potvrdená zmena e-mailu | `email_changed` | others |
| Zapnutie / vypnutie 2FA / nové záložné kódy | `two_factor_changed` | others |
| Pridanie / odstránenie passkey | `passkey_changed` | none |
| Deaktivácia účtu | `account_disabled` | all (pevné) |
| Odhlásenie všade / incident | `logout / security` | all (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

```php
'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:

```php
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](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/auth-for-laravel.md)
