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ĺpec | Typ | Poznámka |
|---|---|---|
id | bigint PK | |
authenticatable_type / _id | morph kľúč | Vlastniaci model; typ kľúča podľa passkeys.key_type. |
credential_id | text | ID kľúča v base64url (pri roamingových kľúčoch až ~1364 znakov). |
credential_id_hash | char(64), unique | sha-256 z credential_id — skutočný vyhľadávací kľúč. |
public_key | text | Base64 surových bajtov verejného COSE kľúča. |
user_handle | string, indexovaný | Nepriehľadný identifikátor pre prihlásenie bez mena. |
transports | jsonb, nullable | Transporty nahlásené autentifikátorom. |
aaguid | uuid, nullable | ID modelu autentifikátora. |
sign_count | unsigned bigint | Predvolene 0 — počítadlo na detekciu klonov; posúva sa vždy len dopredu. |
name | string, nullable | Kozmetický názov. |
attestation_format | string, nullable | Zaznamenaný formát vyhlásenia (none, packed, apple, …). |
attestation_type | string(16), nullable | Dosiahnutý stupeň dôkazu (none, self, basic, anonca); null pri záznamoch starších ako tento stĺpec. |
backup_eligible / backup_state | boolean | Predvolene false. backup_eligible sa určí pri registrácii a už sa nemení; backup_state sa aktualizuje pri každom prijatom prihlásení. |
last_used_at | timestamp, nullable | Zapíše sa pri každom úspešnom prihlásení. |
created_at / updated_at | timestamps | |
deleted_at | soft deletes | Odvolané 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 ulidPrejavte 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.