DhokoAuthaz
DocumentationAPI Reference
  • Get Started

    • Authaz
    • Core Concepts
    • Set up your app
    • Quickstart — cURL
  • Authentication

    • Authentication Settings
    • Signup
    • Invitations
    • Password Authentication
    • Multi-Factor Auth
    • Magic Link
    • OAuth / Social Login
    • Passkey (WebAuthn)
    • SAML SSO
    • Machine-to-Machine (M2M)
    • API Keys
  • Authorization

    • Authorization
    • Resources
    • Policies
    • Roles
    • Access Explorer
  • Tenancy

    • Multi-tenancy
    • Tenancy Customization
  • Brand & Host

    • Branding
    • Custom Domains
    • Communications & Email Templates
  • Operate

    • Users
    • Analytics
    • Audit Logs
    • Application Settings
  • SDK Quickstarts

    • Quickstart — Next.js
    • Quickstart — React SPA
    • Quickstart — Hono
    • Quickstart — .NET (Authaz.Sdk)
  • Recipes

    • Recipes & Cookbook
    • Next.js — first integration
    • Next.js — B2B SaaS (multi-tenant)
    • Hono — first integration
    • Hono — B2B SaaS (multi-tenant)
    • React SPA — first integration
    • React SPA — B2B SaaS (multi-tenant)
    • .NET — first integration
    • .NET — B2B SaaS (multi-tenant)
  • Reference

    • Tokens
    • API Reference
    • Errors & Troubleshooting
  • Documentation

    • How Authaz is Built
  1. Authaz
  2. Docs
  3. Authentication
  4. Passkey (WebAuthn)

Authentication

Passkey (WebAuthn)

4 min read·Updated May 7, 2026

Passkeys are the modern replacement for passwords — phishing-resistant by design, with no shared secret on Authaz's side. Users sign in with whatever authenticator their device offers: Touch ID, Face ID, Windows Hello, a YubiKey, or a synced passkey from iCloud Keychain / Google Password Manager / 1Password.

Use it in your app. Once enabled, Passkey appears as a sign-in option on Authaz Sign-In automatically — your app code doesn't change. The standard sign-in flow (Next.js · React · Hono · cURL) routes the user through whichever method they pick.

# Enable passkeys for an application
curl -X PUT https://your-app.authaz.io/api/v1/applications/{appId}/auth/passkey \
  -H "X-API-Key: $AUTHAZ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": true }'

The Passkey button appears on Authaz Sign-In automatically.

How it works#

Previous
OAuth / Social Login
Next
SAML SSO

WebAuthn is a public-key protocol. The user's authenticator generates a keypair scoped to your domain; the private key never leaves the device, and Authaz only ever sees the public key.

The flow has two phases:

Registration — first-time setup, after the user has signed in with another method (or during the verified-email signup flow):

1. Browser asks Authaz for registration options    (POST /auth/passkey-provider/register/start)
2. Authaz returns a challenge and the user's ID
3. Browser prompts the authenticator (Touch ID, etc.)
4. Authenticator returns an attestation
5. Browser sends it to Authaz                      (POST /auth/passkey-provider/register/complete)
6. Authaz verifies the attestation and stores the public key

Authentication — every subsequent sign-in:

1. Browser asks Authaz for assertion options       (POST /auth/passkey-provider/login/start)
2. Authaz returns a challenge
3. Browser prompts the authenticator
4. Authenticator returns a signed assertion
5. Browser sends it to Authaz                      (POST /auth/passkey-provider/login/complete)
6. Authaz verifies the signature, creates a session

Authaz Sign-In does all of this for you. You only need to call these endpoints directly if you're building a custom login UI.

Authenticator preferences#

By default Authaz accepts any platform or roaming authenticator:

  • Platform — built into the device (Touch ID, Face ID, Windows Hello, Android biometrics).
  • Roaming — external (YubiKey, Solo Key, phone-as-passkey via QR).

User verification is required (the user must present a biometric or PIN), and resident keys (a.k.a. discoverable credentials, syncable passkeys) are required so users don't need to type a username first.

These defaults match what RP guidance from FIDO Alliance recommends and what Apple, Google, Microsoft now ship by default.

Signing up with passkey#

You have two paths:

Email-verified signup (recommended) — user proves they control the email before registering a passkey:

1. User enters email
2. Authaz sends a verification code
3. User enters the code
4. User registers a passkey on the spot

Endpoints:

POST /auth/passkey-provider/signup/verify-email/request
POST /auth/passkey-provider/signup/verify-email/confirm
POST /auth/passkey-provider/signup/start
POST /auth/passkey-provider/signup/complete

Direct signup — passkey first, email is captured but unverified. Useful for invite-only contexts where you've already validated the email out of band:

POST /auth/passkey-provider/signup/start
POST /auth/passkey-provider/signup/complete

Adding a passkey to an existing user#

A signed-in user can register more passkeys (e.g. add a YubiKey alongside Touch ID, or sync to a second device):

POST /auth/passkey-provider/register/start
POST /auth/passkey-provider/register/complete

The user's session must be valid; Authaz won't let an unauthenticated request enroll a passkey for someone else.

Listing and removing passkeys#

# List the current user's passkeys
curl https://your-app.authaz.io/api/v1/users/me/passkeys \
  -H "Authorization: Bearer USER_ACCESS_TOKEN"
 
# Remove one
curl -X DELETE https://your-app.authaz.io/auth/passkey-provider/passkeys/{passkeyId} \
  -H "Authorization: Bearer USER_ACCESS_TOKEN"

Each entry includes name (best-effort, derived from the authenticator), createdAt, lastUsedAt, and the AAGUID — useful for surfacing "Touch ID on iPhone" vs. "YubiKey 5C" in your settings page.

Account recovery#

Passkeys can't be reset over email — the private key is tied to a device. Build a recovery path that doesn't depend on the passkey itself:

  • Recovery codes. Generate at registration time, ask the user to print or store them. Burn one code to register a new passkey.
  • Secondary factor. If the user also has a password or MFA enrolled, those let them re-add a passkey from a new device.
  • Operator-assisted reset. Verified support staff can wipe a user's passkeys via DELETE /api/v1/users/{userId}/passkeys — pair with a real identity-verification step.

Authaz doesn't pick a recovery story for you because the right answer depends on your risk tolerance.

Why use passkeys#

  • Phishing-resistant. The keypair is bound to your domain. A lookalike site can't steal anything because it can't get the authenticator to sign for it.
  • No password to leak, reuse, or rotate. No "must contain one symbol", no breach checks, no reset flows clogging support.
  • Faster sign-in. A double-tap is faster than typing a password.
  • Works offline (mostly). The challenge/response is a single round-trip; once the user has the assertion, network outages don't strand them.

When to keep passwords too#

  • Account recovery — see above.
  • Older devices without WebAuthn support — increasingly rare, but enterprise fleets lag.
  • Users who don't trust biometrics — let them choose.

It's perfectly fine (and recommended) to ship Passkey + Password together and let users pick on Authaz Sign-In.

Next steps#

  • Password — pair with passkey for recovery.
  • OAuth/Social — another high-trust sign-in method.
  • cURL quickstart — the surrounding OAuth flow once a passkey assertion succeeds.