---
title: "Registrácia — Passkeys for Laravel | Roundly"
description: "Pripravte možnosti pre navigator.credentials.create(), overte atestačnú odpoveď a uložte prístupový kľúč s vlastným názvom."
url: https://roundly-consulting.com/sk/open-source/navody/passkeys-for-laravel/registracia
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)

# Registrácia

Registrácia pridá prihlásenému používateľovi nový prístupový kľúč na dve volania handle účtu: pripravte možnosti pre prehliadač, potom overte jeho odpoveď a kľúč uložte. Voliteľný názov slúži ako popis na obrazovke „Vaše prístupové kľúče“:

```php
use RoundlyConsulting\Passkeys\Facades\Passkeys;
use RoundlyConsulting\Passkeys\DataTransferObjects\RegistrationResponseData;

// 1. Server -> client: creation options (also stores a single-use challenge).
$options = Passkeys::for($user)->registrationOptions();
return response()->json($options); // the browser parses publicKey for navigator.credentials.create()

// 2. Client -> server: verify the attestation response and persist the credential.
//    Pass an optional friendly name for a "your passkeys" screen.
$passkey = Passkeys::for($user)->register(
    RegistrationResponseData::fromArray($request->validated()),
    name: 'MacBook Touch ID',
);
```

## Možnosti registrácie

registrationOptions() vracia CreationOptionsData. Objekt je JsonSerializable do JSON formy WebAuthn — publicKey je PublicKeyCredentialCreationOptionsJSON s binárnymi položkami v base64url a vedľa neho ide ceremonyId. navigator.credentials.create() ho priamo neprijme: prehliadač publicKey najprv prevedie cez PublicKeyCredential.parseCreationOptionsFromJSON() (pozri Na strane prehliadača):

```json
{
  "ceremonyId": "…40 chars…",
  "publicKey": {
    "rp":   { "id": "example.com", "name": "Example" },
    "user": { "id": "…b64url…", "name": "jane@example.com", "displayName": "Jane Doe" },
    "challenge": "…b64url…",
    "pubKeyCredParams": [ { "type": "public-key", "alg": -7 }, { "type": "public-key", "alg": -257 } ],
    "timeout": 60000,
    "attestation": "none",
    "excludeCredentials": [ { "type": "public-key", "id": "…b64url…", "transports": ["internal"] } ],
    "authenticatorSelection": {
      "residentKey": "required",
      "requireResidentKey": true,
      "userVerification": "required"
    }
  }
}
```

- excludeCredentials obsahuje existujúce kľúče používateľa, takže ten istý autentifikátor sa nezaregistruje dvakrát.
- Jednorazová challenge sa uloží na serveri pod ceremonyId na challenge.ttl sekúnd.
- Bezstavová aplikácia pošle ceremonyId späť spolu s odpoveďou; aplikácia so session ho môže poslať späť alebo uložiť do session.

## Na strane prehliadača

Balík neobsahuje žiadny JavaScript. Načítajte možnosti, odovzdajte options.publicKey cez PublicKeyCredential.parseCreationOptionsFromJSON() do navigator.credentials.create() a credential.toJSON() pošlite späť spolu s ceremonyId — routy sú vaše a route v skupine web Laravelu potrebuje aj hlavičku CSRF:

```js
const options = await (await fetch('/passkeys/options')).json();
const credential = await navigator.credentials.create({
    publicKey: PublicKeyCredential.parseCreationOptionsFromJSON(options.publicKey),
});
await fetch('/passkeys', { method: 'POST', headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ ...credential.toJSON(), ceremonyId: options.ceremonyId }) });
```

Starším prehliadačom parseCreationOptionsFromJSON() aj toJSON() chýbajú: overte ich dostupnosť a tam, kde chýbajú, pred volaním preveďte challenge, user.id a každé excludeCredentials\[\].id z base64url na ArrayBuffer a pred odoslaním zakódujte rawId, response.clientDataJSON a response.attestationObject do base64url.

## Odpoveď prehliadača

RegistrationResponseData::fromArray() načíta štandardný JSON z prehliadača — tvar, ktorý vytvorí credential.toJSON() — a striktne dekóduje binárne položky z base64url: rawId (alebo id), ceremonyId, response.clientDataJSON, response.attestationObject a voliteľný zoznam response.transports. Poškodená odpoveď vyhodí InvalidClientData. credential.toJSON() ceremonyId neobsahuje, preto ho pridá frontend; bez neho sa challenge nenájde a ceremónia zlyhá výnimkou ChallengeExpired.

## Čo overí register()

register() vykoná kontroly podľa WebAuthn §7.1 v predpísanom poradí a vráti uložený Passkey, alebo vyhodí podtriedu PasskeyException:

- clientDataJSON sa dá dekódovať a jeho typ je webauthn.create.
- Challenge pre ceremonyId existuje, bola vydaná pre registráciu a zhoduje sa (porovnanie v konštantnom čase).
- Challenge bola vydaná pre tohto používateľa — dodatočná ochrana pri registrácii administrátorom v mene používateľa.
- Origin je v allowliste a cross-origin politika je splnená.
- Atestačný objekt sa striktne dekóduje z CBOR, jeho fmt je platný identifikátor formátu a hash RP ID sa zhoduje.
- Príznak prítomnosti používateľa je nastavený, overenie používateľa tiež, ak sa vyžaduje, a príznaky zálohy sú konzistentné. Oprávnenosť na zálohu sa uloží do backup\_eligible a počas života kľúča sa nemení.
- Sú prítomné atestované údaje kľúča, ID kľúča má najviac 1023 bajtov (WebAuthn L3 §7.1 — dlhšie sa odmietne výnimkou InvalidAuthenticatorData) a jeho algoritmus je podporovaný a ponúknutý.
- Atestačné vyhlásenie sa overí — alebo sa predvolene len zaznamená (pozri Atestácia).
- ID kľúča ešte nie je zaregistrované, vrátane odvolaných. Ak súbežne prebehnú dve registrácie s rovnakým ID, rozhodne unikátny index a neúspešná požiadavka dostane rovnakú výnimku CredentialAlreadyRegistered. Potom sa kľúč uloží a spustí sa PasskeyRegistered.

## Nastavenia pre jedno volanie

Upravte jednu ceremóniu bez zmeny globálnych predvolieb — prázdne položky preberú hodnotu z konfigurácie. Okrem overenia používateľa, atestácie a časového limitu môžete vyžiadať aj cross-platform (roamingový bezpečnostný kľúč) alebo nerezidentný kľúč:

```php
use RoundlyConsulting\Passkeys\DataTransferObjects\RegistrationOptionsOverrides;
use RoundlyConsulting\Passkeys\Enums\AttestationConveyance;
use RoundlyConsulting\Passkeys\Enums\AuthenticatorAttachment;
use RoundlyConsulting\Passkeys\Enums\ResidentKey;
use RoundlyConsulting\Passkeys\Enums\UserVerification;

$options = Passkeys::for($user)->registrationOptions(new RegistrationOptionsOverrides(
    userVerification: UserVerification::Preferred,
    attestation: AttestationConveyance::Direct,
    timeoutMs: 30_000,
    residentKey: ResidentKey::Discouraged,
    authenticatorAttachment: AuthenticatorAttachment::CrossPlatform,
));
```

Predvolené nastavenie zostáva residentKey: required (prihlásenie bez mena) a authenticatorSelection sa bez úprav serializuje bajt po bajte rovnako.

## Priame použitie akcií

Obe volania sú samostatné akcie, ktoré si môžete vytiahnuť z kontajnera a zavolať sami (pozri DI a akcie):

```php
use RoundlyConsulting\Passkeys\Actions\GenerateRegistrationOptionsAction;
use RoundlyConsulting\Passkeys\Actions\VerifyRegistrationAction;

$options = app(GenerateRegistrationOptionsAction::class)->execute($user, $overrides);
$passkey = app(VerifyRegistrationAction::class)->execute($user, $response, $name);
```

Balík neobsahuje routy, controllery, CSRF, validáciu, obmedzovanie pokusov ani JavaScript pre frontend. Pripravte jeden endpoint, ktorý vráti JSON s možnosťami, a druhý, ktorý prijme odpoveď prehliadača a zavolá Passkeys::for($user)->register().

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