Read from the package's own PHP files at the commit 21b1a4b36943: its namespaces, classes, interfaces and enums, their public constants, properties and methods with their PHPDoc, and the options its factories take. Nothing of it is run.
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