---
title: "Model používateľa — Passkeys for Laravel | Roundly"
description: "Pridajte stĺpec s nepriehľadným identifikátorom, implementujte HasPasskeys cez trait InteractsWithPasskeys a spúšťajte ceremónie priamo z modelu."
url: https://roundly-consulting.com/sk/open-source/navody/passkeys-for-laravel/model-pouzivatela
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Passkeys for Laravel](https://roundly-consulting.com/sk/open-source/navody/passkeys-for-laravel.md)

# Model používateľa

Každý model, ktorý môže vlastniť prístupové kľúče (passkeys), implementuje kontrakt HasPasskeys; trait InteractsWithPasskeys je hotová implementácia. Najprv pridajte nullable a unikátny stĺpec pre nepriehľadný identifikátor používateľa bez osobných údajov — vytvorí ho Blueprint makro passkeyUserHandle() na ľubovoľnej tabuľke účtov, pomenovaný podľa passkeys.user.handle\_column:

```php
// database/migrations/xxxx_add_passkey_user_handle_to_users_table.php
Schema::table('users', function (Blueprint $table): void {
    $table->passkeyUserHandle();   // string(passkeys.user.handle_column)->nullable()->unique()
});
```

Potom upravte model:

```php
use Illuminate\Foundation\Auth\User as Authenticatable;
use RoundlyConsulting\Passkeys\Concerns\InteractsWithPasskeys;
use RoundlyConsulting\Passkeys\Contracts\HasPasskeys;

final class User extends Authenticatable implements HasPasskeys
{
    use InteractsWithPasskeys;
}
```

Ak máte viac modelov účtov (guardov), pridajte stĺpec do každej tabuľky, ktorej model vlastní prístupové kľúče.

## Statická analýza

Pre Larastan / PHPStan je Blueprint makro deklarované ako passkeyUserHandle(): ColumnDefinition. Makro existuje, až keď sa service provider balíka spustí. Larastan spúšťa hostiteľskú aplikáciu s auto-discovery a makro v nej zvyčajne nájde — nie však vtedy, keď sa provider počas analýzy nenačíta: pri vývoji balíka pod Testbench, s dont-discover alebo s ručne registrovaným providerom. Migrácia, ktorá makro volá, by tam inak zlyhala s „Call to an undefined method“. Balík preto obsahuje rozšírenie pre PHPStan (RoundlyConsulting\\Passkeys\\PHPStan\\PasskeyMacrosExtension), ktoré phpstan/extension-installer načíta cez extra.phpstan.includes — nič nekonfigurujete. Bez installera ho pridajte ručne:

```yaml
includes:
    - vendor/roundly-consulting/passkeys-for-laravel/extension.neon
```

## Kontrakt

Ceremónie potrebujú len tieto štyri metódy. Trait ich implementuje za vás; vlastnú implementáciu napíšte, ak potrebujete špecifické ukladanie identifikátora alebo odvodenie mena:

```php
interface HasPasskeys
{
    public function passkeyUserHandle(): string;   // opaque, non-PII, stable per user
    public function passkeyUserName(): string;      // authenticator "name" (e.g. email)
    public function passkeyDisplayName(): string;   // authenticator "display name" (e.g. full name)
    public function passkeys(): MorphMany;          // the user's stored credentials
}
```

## Ceremónie priamo na modeli

Trait sprístupňuje ceremónie aj ako metódy modelu, takže podmetom je samotný používateľ. Ide o skratky pre handle účtu — každá deleguje na Passkeys::for($this), takže ich vidia aj vaše prepísané akcie a Passkeys::fake():

```php
$options = $user->passkeyRegistrationOptions();                   // Passkeys::for($user)->registrationOptions()
$passkey = $user->registerPasskey($response, 'MacBook Touch ID'); // ->register()
$options = $user->passkeyAuthenticationOptions($overrides);       // ->authenticationOptions()

$user->hasPasskeys();   // ->exists() — at least one active (non-revoked) passkey
$user->passkeyCount();  // ->count()
```

- passkeys() — MorphMany vzťah k uloženým kľúčom používateľa.
- passkeyRegistrationOptions(?RegistrationOptionsOverrides) — možnosti registrácie pre tohto používateľa.
- registerPasskey(RegistrationResponseData, ?string $name) — overí a uloží kľúč pre tohto používateľa.
- passkeyAuthenticationOptions(?AuthenticationOptionsOverrides) — možnosti prihlásenia viazané na kľúče tohto používateľa.
- hasPasskeys() / passkeyCount() — či a koľko aktívnych (neodvolaných) kľúčov účet má.

## Identifikátor používateľa

Identifikátor sa generuje lenivo a uloží sa pri prvom volaní registrationOptions() alebo authenticationOptions() viazanom na používateľa — ide o malý zápis v inak čítacom volaní. Zápis je cielený:

- Mení len stĺpec s identifikátorom, takže neuložené zmeny na modeli zostanú neuložené — model sa znova neukladá.
- Vyplní len prázdny stĺpec, takže pri súbežných prvých požiadavkách vyhrá prvý uložený identifikátor a použijú ho všetky požiadavky.
- Nikdy nevloží neuložený model: na modeli, ktorý ešte neexistuje, sa identifikátor len nastaví a uloží ho až uloženie samotného modelu.

Vďaka tomu stačí na vopred vygenerovaný identifikátor jeden riadok — zavolajte passkeyUserHandle() pri vytváraní používateľa:

```php
// e.g. in a User creating() observer
$user->passkeyUserHandle(); // sets base64url(random_bytes(passkeys.user.handle_bytes))
```

Ak identifikátory generujete sami, musia byť v base64url z náhodných bajtov — aspoň 16, bez zarovnania (padding) — napríklad Base64Url::encode(random\_bytes(32)) s triedou RoundlyConsulting\\Crypto\\Codec\\Base64Url. Ceremónia identifikátor dekóduje striktne, takže reťazec, ktorý ho len pripomína, napríklad Str::random(43), odmietne výnimkou InvalidClientData.

Identifikátor musí zostať stabilný. Každý kľúč si ukladá identifikátor, pod ktorým bol zaregistrovaný, a každé prihlásenie — bez mena aj viazané na používateľa — sa odmietne výnimkou CredentialNotFound, keď sa s ním uložený identifikátor vlastníka už nezhoduje. Prepísaním stĺpca teda kľúče účtu fakticky odvoláte a nový účet, ktorý dostane ID zmazaného účtu, ich nikdy nezdedí. Pri traite prihlásenie číta stĺpec priamo, takže identifikátor nikdy nevygeneruje; pri vlastnej implementácii HasPasskeys ho získa cez passkeyUserHandle().

## Meno a zobrazované meno

Autentifikátor zobrazuje názov účtu a zobrazované meno. Predvolene sú to atribúty email a name modelu (so záložnou hodnotou primárneho kľúča). Globálne ich presmerujete cez passkeys.user.name\_attribute a display\_name\_attribute, alebo prepíšte metódy pre vlastnú logiku:

```php
public function passkeyDisplayName(): string
{
    return trim($this->first_name.' '.$this->last_name) ?: $this->email;
}
```

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/passkeys-for-laravel.md)
