Databázová schéma
Tabuľku (predvolene refresh_tokens) vytvorí jediná migrácia, ktorá sa len publikuje. Cudzie kľúče nie sú žiadne:
| Stĺpce | Typ | Poznámka |
|---|---|---|
id | bigint | ID riadku — mení sa pri každej rotácii; relácie adresujte cez family_id. |
owner_type, owner_id | string + bigint/uuid/ulid | Polymorfný vlastník s kompozitným indexom; owner_id sa riadi key_type. |
token_hash | string(128), unique | Uložený odtlačok; zmestí sa aj sha512 v hex. Skrytý pri serializácii. |
family_id | uuid, indexed | Stabilné ID relácie, normalizované na malé písmená. |
access_reference | string(64), nullable, indexed | Nepriehľadný odkaz na prístupový token. Skrytý pri serializácii. |
user_agent, browser, browser_version, os, os_version, device_type, is_bot | nullable | Údaje o zariadení — dodáva aplikácia, prenášajú sa pri rotácii. |
country, city, country_code, ip_address | nullable | Údaje o polohe — dodáva aplikácia, prenášajú sa pri rotácii. |
family_started_at, absolute_expires_at, meta | nullable; meta is jsonb | Stĺpce relácie, ktoré dedí každý riadok rodiny. |
revoked_reason, expires_at, revoked_at | lifecycle | expires_at a revoked_at sú indexované. |
created_at, updated_at, deleted_at | timestamps | Štandardné časové značky a soft delete. |
Prevzatie existujúcej tabuľky tokenov
RefreshTokenBlueprint zopakuje tvar tabuľky balíka vo vašej migrácii: columns() vytvorí celú tabuľku a addSessionColumns() pridá len tri stĺpce relácie — všetky nullable, takže sa zmestia aj do naplnenej tabuľky:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use RoundlyConsulting\PackageToolkit\Enums\KeyType;
use RoundlyConsulting\RefreshTokens\Support\RefreshTokenBlueprint;
// Reproduce the package table in your own migration:
Schema::create('refresh_tokens', function (Blueprint $table): void {
RefreshTokenBlueprint::columns($table, KeyType::Ulid);
});
// Or add only the session columns to an existing tokens table:
Schema::table('refresh_tokens', function (Blueprint $table): void {
RefreshTokenBlueprint::addSessionColumns($table); // family_started_at, absolute_expires_at, meta
});V tej istej migrácii doplňte owner_type, family_started_at a absolute_expires_at. Za začiatok rodiny považujte jej prvý riadok:
use App\Models\User;
use Illuminate\Support\Facades\DB;
DB::table('refresh_tokens')->update(['owner_type' => (new User)->getMorphClass()]);
// family_started_at = the family's FIRST row, not each row's own created_at.
DB::table('refresh_tokens')
->select('family_id', DB::raw('min(created_at) as started'))
->groupBy('family_id')
->orderBy('family_id')
->each(function (object $family): void {
$started = \Carbon\CarbonImmutable::parse($family->started);
DB::table('refresh_tokens')->where('family_id', $family->family_id)->update([
'family_started_at' => $started,
'absolute_expires_at' => $started->addSeconds(7_776_000), // omit if absolute_ttl = 0
]);
});Aj bez doplnenia staré riadky fungujú: sessionStartedAt() použije created_at a rodina, ktorej riadky nemajú absolute_expires_at, nemá strop, kým sa nezaloží nanovo.
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.