Skip to main content
This guide walks you through configuring passkey authentication on your application using Prelude Auth. Passkeys can serve as an MFA step-up factor (the default) and, optionally, as a primary-factor passwordless sign-in method. For the full conceptual reference — ceremony shape, security model, error catalogue — see the Passkey page.

Prerequisites

Before you start, make sure you have:
  • A Prelude account with access to Prelude Auth
  • An Application ID (appID) — see Applications
  • Your Management API key for backend calls
  • A frontend served over HTTPS, or http://localhost:<port> for local development — the WebAuthn API refuses any other origin

Set up passkey authentication

Configure the WebAuthn Relying Party identity for your app. The RP identity is shared across every passkey ceremony — changing it after credentials are registered invalidates them at the authenticator layer, so set it once per environment.
1

Create a passkey configuration

2

Declare verify_passkey on the step-up configuration

Add the step key to your step-up configuration and reference it from any scope whose challenge should require a passkey.
A registered passkey shows up on the user as an identifier of type passkey, so direct-mode entries select on it via identifier_types like any other identifier.To express a passkey-or-OTP fallback, list two direct entries on the same scope — the passkey-gated one first, the OTP fallback second. The runtime serves the first one whose identifier types the user holds:

Enable passwordless login (optional)

Set login_enabled: true on the PasskeyConfig to opt the app into primary-factor passkey sign-in. While the flag is on, registration also requests a discoverable credential (residentKey: required) so the resulting passkey shows up in the browser’s autofill chip.
Existing credentials may not be discoverable. Turning login_enabled on does not retroactively migrate credentials registered while it was off — those were created with the WebAuthn default and platform passkeys (iCloud Keychain, Google, Microsoft, 1Password, …) are typically discoverable but older hardware security keys often are not. Affected users keep using step-up MFA without change, but to use the passwordless flow they need to register a new credential.
Authenticators that can’t store a resident key — most older hardware security keys — will refuse the ceremony with passkey_registration_failed after the flag flips on.

Enterprise authenticator policy (optional)

Restrict registration to specific authenticator models via the AAGUID allowlist / blocklist on the PasskeyConfig. Pairs with attestation_preference: "direct" or "enterprise" — with "none" most authenticators return an all-zeros AAGUID and the allowlist matches nothing.
The blocklist wins on collision. Filters only run at registration time — credentials stored before the policy was tightened remain valid for assertions, so changing the rule doesn’t retroactively lock anyone out. The FIDO Alliance publishes a Metadata Service that maps AAGUIDs to authenticator vendor/model names — useful when curating the allowlist.

Subscribe to passkey lifecycle events (optional)

Three webhook events surface passkey activity for audit and user notifications: Subscribe via the existing webhook configuration:
See the Passkey reference for the typed payload shape.

Surface passkey state in access tokens (optional)

The custom-claims pipeline exposes a has_passkey template input. Map it on your app’s claims configuration to let your frontend decide whether to prompt the user to enrol:
The flag is recomputed on every access-token issuance and flips on the active session’s next refresh as soon as a credential is registered or removed — no extra round trip needed.

What’s next?

Now that your backend is configured, integrate the frontend using the Web Passkey SDK guide. For the full reference — ceremony walk-through, security model, error catalogue, AAGUID policy details, and webhook payloads — see the Passkey page.