Lue dans les fichiers PHP du paquet au commit 21b1a4b36943 : ses espaces de noms, classes, interfaces et énumérations, leurs constantes, propriétés et méthodes publiques avec leur PHPDoc, et les options que prennent ses fabriques. Rien n’en est exécuté.
PasskeyMethodclassPasskeys (WebAuthn) over web-auth/webauthn-lib, framework-free: a first factor, after which no second one is asked (Marco's decision QA1: it proves the device and the gesture or the code that unlocks it - user verification is required at every ceremony).
7 methods · 2 constants
PasskeyRecordclassA passkey as omnibase's userPasskey table holds it: the 13 fields of WebAuthn's credential record (webauthn-lib's Webauthn\CredentialRecord), under the same names, in the values of the columns - the credential id and the public key in standard base64 with its padding (the text of the bundle's `base64` type and of omnibase's `passkey_base64`), the AAGUID as its text, the trust path as the array webauthn-lib normalizes it to (`[]`, or `['x5c' => [...]]`). A row written by web-auth/webauthn-symfony-bundle is a record here (fromRow()), and a record made here is a row the bundle reads (toRow()); toCredentialRecord() and fromCredentialRecord() do what omnibase's PasskeyRepository does.
8 methods · 13 properties · 1 constant
RelyingPartyclassWho the passkeys belong to: the relying party's id (a registrable domain: a passkey made for it serves every host under it), the name some authenticators show, and the origins a ceremony may come from.
5 methods · 4 properties
PasskeysinterfaceThe passkeys of the application's accounts (omnibase: the userPasskey table, Base\Entity\User\Passkey), as PasskeyRecord values.
4 methods
InMemoryPasskeysclassThe passkeys in memory, by credential id: tests, the harness's bare script, a first try in plain PHP.
5 methods · 3 properties
SoftwareAuthenticatorclassA passkey authenticator in PHP, for tests (the one lesringostars' sign-in characterisation used, plan "omniauth" AU0): a P-256 key made by OpenSSL, which answers the options a site gives with the JSON a browser's PublicKeyCredential.toJSON() posts - attestation "none" at a registration, an ES256 signature at a sign-in. The person is present and verified (the flags UP and UV) unless told otherwise; nothing is backed up unless told.
8 methods · 5 properties
Omniauth\WebAuthn
PasskeyMethod class
final class PasskeyMethod implements Challenging, Enrolling PasskeyMethod.php:62
Passkeys (WebAuthn) over web-auth/webauthn-lib, framework-free: a first factor, after which no second one is asked (Marco's decision QA1: it proves the device and the gesture or the code that unlocks it - user verification is required at every ceremony).
Signing in: begin() gives the request options (a 32-byte challenge, the relying party's id, user verification required, no list of credentials: a discoverable passkey, the person picks it), as the JSON webauthn-lib's serializer writes - the JSON assets/security/webauthn.js parses today with PublicKeyCredential.parseRequestOptionsFromJSON(); verify() takes what the browser's credential.toJSON() posts (['json' => ...], or its keys as the proof), finds the passkey by its id, has webauthn-lib check the assertion (challenge, origin, relying party, presence and verification, signature, counter, backup flags) and saves the counter and the flags (Passkeys::used()).
Registering, from the settings: enrolBegin() gives the creation options for the account (its handle as the user's id, its identifier and display name, its passkeys excluded); enrolConfirm() has webauthn-lib check the attestation and adds the record (['label' => ...] names it).
What a ceremony remembers between its two steps (the challenge, the relying party's id) stays in the attempt, never in the answer; a challenge serves once.
const CHALLENGE_LENGTH = 32const ALGORITHMS = [-7, -257]What webauthn-lib checks by default: ES256, RS256.
PasskeyMethod::__construct()
public function __construct(readonly Accounts $accounts, readonly Passkeys $passkeys, readonly RelyingParty $rp = new RelyingParty(), readonly ?int $timeout = null)$timeoutmilliseconds the browser gives the person, null for its own
PasskeyMethod::factor()
public function factor(): FactorPasskeyMethod::begin()
public function begin(Attempt $attempt, Proof $proof, Context $context): ChallengePasskeyMethod::verify()
public function verify(Attempt $attempt, Proof $proof, Context $context): VerdictPasskeyMethod::enrolBegin()
public function enrolBegin(Attempt $enrolment, Proof $proof, Context $context): ChallengePasskeyMethod::enrolConfirm()
public function enrolConfirm(Attempt $enrolment, Proof $proof, Context $context): EnrolledPasskeyMethod::serializer()
public function serializer(): SerializerInterfaceThe serializer webauthn-lib reads and writes its JSON with (the host may parse a posted credential with it).
PasskeyRecord class
final readonly class PasskeyRecord PasskeyRecord.php:25
A passkey as omnibase's userPasskey table holds it: the 13 fields of
WebAuthn's credential record (webauthn-lib's Webauthn\CredentialRecord),
under the same names, in the values of the columns - the credential id and
the public key in standard base64 with its padding (the text of the
bundle's base64 type and of omnibase's passkey_base64), the AAGUID as
its text, the trust path as the array webauthn-lib normalizes it to
([], or ['x5c' => [...]]). A row written by
web-auth/webauthn-symfony-bundle is a record here (fromRow()), and a record
made here is a row the bundle reads (toRow()); toCredentialRecord() and
fromCredentialRecord() do what omnibase's PasskeyRepository does.
Immutable: after a sign-in, Passkeys::used() receives the record with its counter and backup flags moved (after()).
const NO_AAGUID = '00000000-0000-0000-0000-000000000000'The AAGUID of an authenticator that names no model (attestation "none").
public string $publicKeyCredentialIdThe credential's id: base64 of its bytes, as the column keeps it.
public string $typepublic array $transportshow the browser reaches the authenticator ("internal", "usb", "hybrid"...)
public string $attestationTypepublic array $trustPath[] for none, ['x5c' => [...]] for a chain of certificates
public string $aaguidpublic string $credentialPublicKeyThe public key: base64 of its COSE bytes.
public string $userHandleThe account's handle (Accounts::handle(), its id as text).
public int $counterThe signature counter the authenticator last gave.
public ?array $otherUIpublic ?bool $backupEligiblepublic ?bool $backupStatuspublic ?bool $uvInitialized
PasskeyRecord::__construct()
public function __construct(public string $publicKeyCredentialId, public string $type = 'public-key', public array $transports = [], public string $attestationType = 'none', public array $trustPath = [], public string $aaguid = self::NO_AAGUID, public string $credentialPublicKey = '', public string $userHandle = '', public int $counter = 0, public ?array $otherUI = null, public ?bool $backupEligible = null, public ?bool $backupStatus = null, public ?bool $uvInitialized = null)$transportshow the browser reaches the authenticator ("internal", "usb", "hybrid"...)
$trustPath[] for none, ['x5c' => [...]] for a chain of certificates
PasskeyRecord::credentialId()
public function credentialId(): stringThe credential id's bytes.
PasskeyRecord::publicKey()
public function publicKey(): stringThe public key's COSE bytes.
PasskeyRecord::toCredentialRecord()
public function toCredentialRecord(): CredentialRecordwebauthn-lib's record of this passkey: what a ceremony is checked against (omnibase's PasskeyRepository::credentialRecord()).
PasskeyRecord::fromCredentialRecord()
public static function fromCredentialRecord(CredentialRecord $record): selfThe record of what webauthn-lib made or moved (omnibase's PasskeyRepository::fill()).
PasskeyRecord::after()
public function after(CredentialRecord $checked): selfThis passkey after a sign-in webauthn-lib checked: its counter and its flags as the assertion left them.
PasskeyRecord::fromRow()
public static function fromRow(array $row): selfA row of the userPasskey table, as the database gives it back: the JSON columns as their text (or decoded), the booleans as 0/1 or bools, the counter as a number or its text. Other columns (id, user_id, label, dates) are ignored.
PasskeyRecord::toRow()
public function toRow(): arrayThe 13 columns as the bundle's DBAL types (and omnibase's) write them: base64 text, the JSON columns encoded as Doctrine's JSON type encodes them, the booleans as 0/1 (or null), the counter as a number.
RelyingParty class
final readonly class RelyingParty RelyingParty.php:19
Who the passkeys belong to: the relying party's id (a registrable domain: a passkey made for it serves every host under it), the name some authenticators show, and the origins a ceremony may come from.
By Marco's decision QA9 (2026-10-20), the Symfony site and its Laravel twin share one registrable domain in production: the id is that domain (RELYING_PARTY_ID), and the origins are both hosts'. With no id, each request's host is the id; with no origins, each request's origin is the only one allowed. The port never enters the id ("localhost" for https://localhost:8443 and http://localhost:8132 alike).
public ?string $idpublic ?string $namepublic array $originsthe origins allowed (https://www.example.org, https://twin.example.org), [] for the request's own
public array $insecurethe ids allowed over plain http (WebAuthn's own exception: localhost)
RelyingParty::__construct()
public function __construct(public ?string $id = null, public ?string $name = null, public array $origins = [], public array $insecure = ['localhost'])$originsthe origins allowed (https://www.example.org, https://twin.example.org), [] for the request's own
$insecurethe ids allowed over plain http (WebAuthn's own exception: localhost)
RelyingParty::id()
public function id(Context $context): stringThe relying party's id for this request: the one set, else the request's host (lower case, no port).
RelyingParty::name()
public function name(Context $context): stringThe name an authenticator shows: the one set, else the id (as web-auth/webauthn-symfony-bundle without rp.name).
RelyingParty::origins()
public function origins(Context $context): arrayRelyingParty::serves()
public function serves(Context $context): boolMay this request's host use the id? WebAuthn asks the id to be the host or a domain it is under (a browser refuses otherwise).
Omniauth\WebAuthn\Contract
Passkeys interface
interface Passkeys Passkeys.php:11
The passkeys of the application's accounts (omnibase: the userPasskey table, Base\Entity\User\Passkey), as PasskeyRecord values.
Passkeys::of()
public function of(object $account): iterable- Returns
the account's passkeys (a registration excludes them)
Passkeys::byCredentialId()
public function byCredentialId(string $credentialId): ?PasskeyRecord$credentialIdthe credential's id in base64, as the table keeps it
Passkeys::add()
public function add(object $account, PasskeyRecord $record, ?string $label = null): voidA passkey registered for the account, under the name the person gave it (if any).
Passkeys::used()
public function used(PasskeyRecord $record): voidAfter a sign-in: the counter and the backup flags as the assertion left them (and the host's last-used date).
Omniauth\WebAuthn\Testing
InMemoryPasskeys class
final class InMemoryPasskeys implements Passkeys InMemoryPasskeys.php:10
The passkeys in memory, by credential id: tests, the harness's bare script, a first try in plain PHP.
public array $records = []public array $labels = []public array $uses = []
InMemoryPasskeys::__construct()
public function __construct(readonly Accounts $accounts)InMemoryPasskeys::of()
public function of(object $account): iterableInMemoryPasskeys::byCredentialId()
public function byCredentialId(string $credentialId): ?PasskeyRecordInMemoryPasskeys::add()
public function add(object $account, PasskeyRecord $record, ?string $label = null): voidInMemoryPasskeys::used()
public function used(PasskeyRecord $record): voidSoftwareAuthenticator class
final class SoftwareAuthenticator SoftwareAuthenticator.php:16
A passkey authenticator in PHP, for tests (the one lesringostars' sign-in characterisation used, plan "omniauth" AU0): a P-256 key made by OpenSSL, which answers the options a site gives with the JSON a browser's PublicKeyCredential.toJSON() posts - attestation "none" at a registration, an ES256 signature at a sign-in. The person is present and verified (the flags UP and UV) unless told otherwise; nothing is backed up unless told.
No library: its CBOR is the little WebAuthn needs. A host's tests sign in with it under Symfony and Laravel alike, with no browser.
public readonly string $credentialIdpublic int $counterpublic bool $verifiedpublic bool $backupEligiblepublic bool $backedUp
SoftwareAuthenticator::__construct()
public function __construct(readonly string $origin, ?string $privateKey = null, ?string $credentialId = null, public int $counter = 0, public bool $verified = true, public bool $backupEligible = false, public bool $backedUp = false)$originthe page's origin, as the browser writes it in the client data (https://example.org)
$privateKeya PEM P-256 key, to be the same authenticator from one run to another; a new key otherwise
$credentialIdthe credential's bytes; 32 random bytes otherwise
SoftwareAuthenticator::create()
public function create(string|array $options): arraynavigator.credentials.create() on the creation options (their JSON, or decoded).
SoftwareAuthenticator::get()
public function get(string|array $options): arraynavigator.credentials.get() on the request options (their JSON, or decoded).
SoftwareAuthenticator::publicKey()
public function publicKey(): stringThe credential's public key, COSE (RFC 9053: EC2, ES256, P-256), as a credential record keeps it.
SoftwareAuthenticator::privateKey()
public function privateKey(): stringThe private key, PEM: to be this authenticator again later (new self($origin, $authenticator->privateKey(), $authenticator->credentialId)).
SoftwareAuthenticator::belongsTo()
public function belongsTo(string $userHandle): selfThe account this authenticator's credential belongs to (what create() learns from the options): the userHandle it sends.
SoftwareAuthenticator::encode()
public static function encode(string $bytes): stringbase64url without padding, as WebAuthn's JSON writes bytes.
SoftwareAuthenticator::decode()
public static function decode(string $base64url): string