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

Model Passkey a schéma

RoundlyConsulting\Passkeys\Models\Passkey je polymorfný Eloquent model so soft delete pre uložený WebAuthn kľúč. Vlastníka sprístupňuje morph-to vzťah authenticatable a vyhľadávanie pokrývajú tri scopes:

use RoundlyConsulting\Passkeys\Models\Passkey;

$passkey = Passkey::query()->forCredentialId($base64UrlId)->first();
$owned   = Passkey::query()->forUserHandle($handle)->get();
$mine    = Passkey::query()->ownedBy($user)->get();

$passkey->authenticatable;   // the owning model (MorphTo)
  • forCredentialId($id) — hľadá podľa ID kľúča cez jeho sha-256 hash.
  • forUserHandle($handle) — hľadá podľa identifikátora používateľa pre prihlásenie bez mena.
  • ownedBy($owner) — presne jeden vlastník: jeho morph typ a kľúč.
  • Passkey::hashCredentialId($id) — statický sha-256 hash (aj dlhého) ID kľúča v base64url.
  • advanceSignCount($signCount, $backupState) — jeden podmienený UPDATE, ktorý posunie sign_count dopredu, zapíše backup_state a last_used_at; ak sa počítadlo neposunulo, vráti false (a model znova načíta).
  • recordUsage($backupState) — zapíše backup_state a last_used_at bez posunu počítadla (pokles pri politike flag).
  • Casty: transports (array), sign_count (integer), backup_eligible a backup_state (boolean), last_used_at (datetime).

Schéma

StĺpecTypPoznámka
idbigint PK
authenticatable_type / _idmorph kľúčVlastniaci model; typ kľúča podľa passkeys.key_type.
credential_idtextID kľúča v base64url (pri roamingových kľúčoch až ~1364 znakov).
credential_id_hashchar(64), uniquesha-256 z credential_id — skutočný vyhľadávací kľúč.
public_keytextBase64 surových bajtov verejného COSE kľúča.
user_handlestring, indexovanýNepriehľadný identifikátor pre prihlásenie bez mena.
transportsjsonb, nullableTransporty nahlásené autentifikátorom.
aaguiduuid, nullableID modelu autentifikátora.
sign_countunsigned bigintPredvolene 0 — počítadlo na detekciu klonov; posúva sa vždy len dopredu.
namestring, nullableKozmetický názov.
attestation_formatstring, nullableZaznamenaný formát vyhlásenia (none, packed, apple, …).
attestation_typestring(16), nullableDosiahnutý stupeň dôkazu (none, self, basic, anonca); null pri záznamoch starších ako tento stĺpec.
backup_eligible / backup_statebooleanPredvolene false. backup_eligible sa určí pri registrácii a už sa nemení; backup_state sa aktualizuje pri každom prijatom prihlásení.
last_used_attimestamp, nullableZapíše sa pri každom úspešnom prihlásení.
created_at / updated_attimestamps
deleted_atsoft deletesOdvolané kľúče sa zmažú cez soft delete.

Unikátny index je na credential_id_hash s pevnou dĺžkou, nie na credential_id s premenlivou dĺžkou, takže ID roamingových kľúčov sa uložia celé a index sa zmestí do limitu dĺžky kľúča každej databázy.

Vlastný model

Nasmerujte passkeys.model na podtriedu Passkey. Balík používa nakonfigurovanú triedu všade — vo vzťahu passkeys(), v oboch ceremóniách aj vo factory — takže registrácia vráti vašu triedu a spustia sa jej udalosti modelu. Trieda, ktorá nie je Passkey ani jeho podtriedou, vyhodí InvalidConfigurationException s názvom kľúča — model balíka ju nikdy potichu nenahradí. Scopes, casty, skryté atribúty a hashCredentialId() ponechajte, ceremónie na nich stoja:

// app/Models/Credential.php
use RoundlyConsulting\Passkeys\Models\Passkey;

class Credential extends Passkey
{
    // your accessors, relationships and model events
}

// config/passkeys.php
'model' => App\Models\Credential::class,

Vlastníci s UUID a ULID

Morph stĺpec authenticatable je predvolene bigint. Ak modely vlastniace kľúče používajú primárne kľúče UUID alebo ULID, nastavte typ ešte pred migráciou — všetky vlastniace modely musia mať rovnaký typ kľúča a neznáma hodnota vyhodí InvalidConfigurationException, namiesto toho, aby potichu vytvorila kľúče bigint:

PASSKEYS_KEY_TYPE=uuid   # bigint (default), uuid or ulid

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.