Relácia je rodina tokenov; údaje o zariadení nesie jej aktívny riadok. ID riadkov sa pri každej rotácii menia, preto reláciu adresujte cez ID rodiny — stabilné ID relácie, ktoré sa prirodzene hodí aj ako claim sid vo vašom prístupovom tokene:
$sessions = RefreshTokens::sessions($user);
$sessions->all(); // active rows, newest first
$sessions->find($familyId); // ?RefreshToken — active row of that family
$sessions->revoke($familyId); // bool — revokes every active row of it
$sessions->revokeAllExcept($currentFamilyId); // "log out my other devices"; int
$sessions->revokeOthers($currentAccess->jti); // same, keyed by access reference
$sessions->revokeAll(); // revoke every session
// On the owner model via the trait:
$user->refreshTokens(); // MorphMany, all tokens
$user->sessions(); // MorphMany, active tokens only| Metóda | Vracia | Poznámka |
|---|---|---|
sessions($owner)->all() | Collection<RefreshToken> | Aktívne riadky, od najnovšieho. |
sessions($owner)->find($familyId) | ?RefreshToken | Aktívny riadok danej rodiny; null pri chybnom ID alebo rodine iného vlastníka. |
sessions($owner)->revoke($familyId, $reason) | bool | Odvolá všetky aktívne riadky rodiny (predvolene Logout); false, ak nebolo nič aktívne. |
sessions($owner)->revokeAllExcept($keepFamilyId, $reason) | int | Ponechá jednu reláciu podľa ID rodiny (predvolene LogoutAll); null alebo neznáme ID odvolá všetko. |
sessions($owner)->revokeOthers($currentAccessReference, $reason) | int | Ponechá reláciu s daným odkazom na prístupový token (predvolene LogoutAll); null odvolá všetko. |
sessions($owner)->revokeAll($reason) | int | Odvolá všetky relácie (predvolene LogoutAll). |
session($row)->enrich($device, $location) | void | Zapíše údaje o zariadení a polohe dodané aplikáciou do jedného riadku (model alebo jeho kľúč). |
session($row)->revoke($reason) | bool | Odvolá jeden riadok, ktorý máte k dispozícii (predvolene Manual). |
- Objekt pracuje v rozsahu vlastníka: rodina iného vlastníka — aj vlastníka iného typu s rovnakým id — je neznáma (find() vráti null, revoke() false a nič sa nezmení).
- ID sa pred akýmkoľvek dopytom overia ako UUID — chybné ID vráti null/false, nikdy nie chybu databázy.
- revoke() odvolá všetky aktívne riadky rodiny — rotácia v tolerančnom okne môže nakrátko ponechať dva — a každý odkaz na prístupový token zneplatní raz.
- revokeAllExcept s null alebo neznámym ID odvolá všetko: pri neznámej „aktuálnej relácii“ je bezpečnejšie zlyhať uzavreto.
- $row->sessionStartedAt() vráti začiatok rodiny, ktorý sa pri rotácii dedí bez zmeny.
Metódy na modeli vlastníka
Trait HasRefreshTokens pridáva metódy, ktoré sa čítajú ako vlastník konajúci sám za seba. Každá deleguje na manažéra — je to skratka pre RefreshTokens::sessions($this) —, takže ich RefreshTokens::fake() tiež zaznamená:
use RoundlyConsulting\RefreshTokens\DataTransferObjects\IssueContext;
$new = $user->issueRefreshToken(new IssueContext(accessReference: $access->jti));
$user->findSession($familyId); // ?RefreshToken
$user->revokeSession($familyId); // bool
$user->revokeAllSessions(); // = RefreshTokens::sessions($user)->revokeAll(); returns count
$user->revokeOtherSessions($currentAccess->jti); // keep current, revoke the rest; returns countEndpoint „vaše zariadenia“
Zoznam zostavte z aktívnych riadkov; token_hash a access_reference sú pri serializácii skryté, takže bezpečné je vrátiť aj celé riadky:
return RefreshTokens::sessions($user)->all()->map(fn ($session) => [
'id' => $session->family_id, // stable session id
'browser' => $session->browser,
'os' => $session->os,
'device' => $session->device_type,
'city' => $session->city,
'started_at' => $session->sessionStartedAt(),
'current' => $session->family_id === $currentFamilyId,
]);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.