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

Databázová schéma

Tabuľku (predvolene refresh_tokens) vytvorí jediná migrácia, ktorá sa len publikuje. Cudzie kľúče nie sú žiadne:

StĺpceTypPoznámka
idbigintID riadku — mení sa pri každej rotácii; relácie adresujte cez family_id.
owner_type, owner_idstring + bigint/uuid/ulidPolymorfný vlastník s kompozitným indexom; owner_id sa riadi key_type.
token_hashstring(128), uniqueUložený odtlačok; zmestí sa aj sha512 v hex. Skrytý pri serializácii.
family_iduuid, indexedStabilné ID relácie, normalizované na malé písmená.
access_referencestring(64), nullable, indexedNepriehľadný odkaz na prístupový token. Skrytý pri serializácii.
user_agent, browser, browser_version, os, os_version, device_type, is_botnullableÚdaje o zariadení — dodáva aplikácia, prenášajú sa pri rotácii.
country, city, country_code, ip_addressnullableÚdaje o polohe — dodáva aplikácia, prenášajú sa pri rotácii.
family_started_at, absolute_expires_at, metanullable; meta is jsonbStĺpce relácie, ktoré dedí každý riadok rodiny.
revoked_reason, expires_at, revoked_atlifecycleexpires_at a revoked_at sú indexované.
created_at, updated_at, deleted_attimestampsŠ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 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.