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

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“:

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); // feed publicKey to 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 presne do tvaru, ktorý očakáva navigator.credentials.create({ publicKey }) — binárne položky v base64url a vedľa publicKey aj ceremonyId:

{
  "ceremonyId": "…40 chars…",
  "publicKey": {
    "rp":   { "id": "example.com", "name": "Example" },
    "user": { "id": "…b64url…", "name": "[email protected]", "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.

Odpoveď prehliadača

RegistrationResponseData::fromArray() načíta štandardný JSON z prehliadača 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.

Č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 s podporovaným a ponúknutým algoritmom.
  • 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. 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ľúč:

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

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

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.