Passkeys are a phishing-resistant alternative to traditional forms of authentication (such as username and password) that offer an easier and more secure user experience. They are modeled from FIDO® W3C Web Authentication (WebAuthn) and Client to Authenticator Protocol (CTAP) specifications. Auth0 currently supports passkeys as an authentication method for database connections with two methods of implementation:Documentation Index
Fetch the complete documentation index at: https://auth0.com/llms.txt
Use this file to discover all available pages before exploring further.
- Universal Login passkeys for web-based applications.
- Passkey APIs for native mobile applications (iOS, Android) and web applications.
- Embedded Login for web-based and native applications
Before you start
Configure a custom domainNative passkeys require the use of a . Before proceeding, ensure you have configured a custom domain for your tenant. To learn more, review Custom Domains.Configure your passkey policyBefore you can implement native passkeys for Android or iOS applications, you must configure a passkey policy in your Auth0 tenant. To prepare your tenant, follow the steps in Configure Passkey Policy.Prepare your applicationAll applications using the Passkey APIs must add the
Passkey grant and configure the Relying Party ID (RP ID). Depending on your platform, you may also need to configure additional settings through your or the .How it works
The Passkey APIs use a combination of the Auth0 Authentication API and platform-specific credential APIs to embed challenge flows directly into your application. For native mobile apps, this means using iOS or Android platform APIs. For web applications, this means using the WebAuthn browser API. This allows you to create an integrated signup and login experience that does not rely on redirecting users through their browsers to complete authentication. The following example demonstrates what a new user may experience during the passkey signup flow:- A new user launches your mobile application and accesses the login screen. Since they are a new user, they select the Sign Up button.
- On the next screen, the user enters their email address and selects Create Account.
- Next, the user is asked if they want to create a passkey for your application. To proceed, the user selects Continue.
- To generate a passkey, the user must locally authenticate on their device using biometrics or another authentication method, such as entering a PIN.
- After local authentication is complete, a new passkey is saved to the user’s device and synced with their passkey provider, such as iCloud Keychain or Google Password Manager.
- After the passkey is saved, the user continues your new user registration process to finalize their account.
Configure device settings
- iOS
- Android
- Web
Configure Device Settings in Auth0 Dashboard:
- Navigate to Applications > Applications and select your application.
- At the bottom of the Settings tab, select Advanced Settings.
- Choose the Device Settings tab.
- In the iOS section, enter your IDs from Apple:
- Team ID
- App ID
- Select Save Changes.
-
Auth0 automatically hosts the
apple-app-site-associationfile on your tenant’s custom domain athttps://YOUR_CUSTOM_DOMAIN/.well-known/apple-app-site-associationbased on the Team ID and App ID you configure. You do not need to host this file yourself. -
In Xcode, enable the Associated Domains entitlement and add an entry for your custom domain in a similar format:
webcredentials:YOUR_CUSTOM_DOMAIN.
Enable the Passkey grant
To enable the Passkey grant on all platforms:
- Navigate to Applications > Applications and select your application.
- In the Advanced Settings section, select the Grant Types tab.
- Enable the Passkey grant, then select Save Changes.
- Update
grant_typesto includeurn:okta:params:oauth:grant-type:webauthn. - For native apps, use the
mobileobject to specify iOS and Android device settings as needed.
Relying party ID (rpId)
For end users to authenticate with a single passkey across different application types or application types with different subdomains, set the relying party ID to the root or parent domain in Auth0 Dashboard > Tenant Settings.
Implement passkey flows
You can define the following passkey flows for your application:- Signup flow: Allows new users to generate and save a passkey during the user registration process.
- Login flow: Allows an existing user who has already enrolled in passkeys to authenticate with their saved passkey during the login process.
- Enrollment flow: Allows existing users to add a passkey to their account after authentication.
Signup flow
A user initiates the passkey signup flow on their first login attempt to your application. If the user provides an identifier that already exists, we recommend prompting the user to complete the login flow instead. Otherwise, the action will fail.- Your application initiates the signup challenge by calling the
POST /passkey/registerendpoint:
- If you do not specify a
realm, your tenant’s default directory is used. - By default,
emailis the required identifier. If you have enabled Flexible Identifiers for your database connection, you may use a combination ofemail,phone_number, orusernameinstead.
- Auth0 returns
PublicKeyCredentialCreationOptionsneeded to create passkeys, along with anauth_sessionID:
- Your application creates a passkey on the user’s device with the returned
PublicKeyCredentialCreationOptions. The method depends on your platform:
- iOS
- Android
- Web
Use
ASAuthorizationPlatformPublicKeyCredentialProvider to create the credential with Face ID, Touch ID, or device PIN. To learn more, review iOS registration documentation.- Your application uses the credential information from the registration process to call the
POST /oauth/tokenendpoint to exchange credentials for tokens:
- Auth0 creates a new user account and returns the requested tokens as shown in the example return:
Login flow
An existing user initiates the passkey login flow when they attempt to log in to your application. This flow only applies to existing users who have saved passkeys to their accounts during initial signup.- Your application calls the
POST /passkey/challengeendpoint to initiate the login challenge:
If you do not specify a
realm, your tenant’s default directory is used.- Auth0 returns
PublicKeyCredentialRequestOptionsalong with anauth_session:
- Your application uses the returned
PublicKeyCredentialRequestOptionsto retrieve a passkey from the user’s device. The method depends on your platform:
- iOS
- Android
- Web
Use
ASAuthorizationPlatformPublicKeyCredentialProvider to retrieve the credential with Face ID, Touch ID, or device PIN. To learn more, review iOS login documentation.- Your application uses the credential information from the login process to call the
POST /oauth/tokenendpoint to exchange credentials for tokens:
- Auth0 authenticates the credentials and returns the requested tokens:
Enrollment flow
The enrollment flow allows users to add a passkey to their account after they’ve already authenticated with another method, such as username and password. When an existing, authenticated user wants to enroll a new passkey, use the My Account API.Before you start
Before initiating the enrollment flow, ensure you:
- Activate the My Account API for your tenant.
- Retrieve an access token with the
create:me:authentication_methodsscope for the/meendpoint.
- Your authenticated application calls the
POST /me/v1/authentication-methodsendpoint with the access token:
- Auth0 returns a challenge and session ID:
- Your application uses the returned
PublicKeyCredentialCreationOptionsto create a passkey on the user’s device, following the same platform-specific steps as the signup flow:
- iOS
- Android
- Web
Use
ASAuthorizationPlatformPublicKeyCredentialProvider to create the credential with Face ID, Touch ID, or device PIN. To learn more, review iOS registration documentation.- After the user creates the passkey with their authenticator, call the
POST /me/v1/authentication-methods/passkey|new/verifyendpoint to complete the enrollment:
Relying party ID
A passkey created in one of your applications can be used to sign in to your other applications, Native or Web Applications, when those applications share the same relying party ID (rpId). This works because passkey providers (iCloud Keychain, Google Password Manager, 1Password, Dashlane, and others) sync credentials across the user’s devices within the same provider.
Move users between platforms
In most cases, users do not need to scan a QR code or use a second device. The flow depends on whether the passkey is already available on the device they’re using:- Same provider, different device (most common): A user enrolls a passkey on your iOS app; their iCloud Keychain syncs it to their Mac, where they can sign in to your web app immediately. Same applies to Android passkeys synced via Google Password Manager to Chrome on a Chromebook or Windows PC signed into the same Google account.
- Cross-ecosystem or shared device (less common): If the passkey isn’t available on the device the user is on (for example, an iPhone passkey used on a Windows PC, or a public computer), the browser offers a QR code to authenticate via the user’s phone using hybrid transport (CTAP 2.2). The user keeps their passkey on their phone; the QR code only bridges the two devices for that one sign-in.
Choose your Relying Party ID
TherpId determines which origins can use a passkey. Auth0 sets the rpId to your custom domain by default. Choose the rpId that best matches the scope across which you want passkeys to work — and no broader.
Recommended: Use a parent domain that scopes to your authentication and product surfaces, such as auth.example.com or accounts.example.com. A passkey created with “rpId=auth.example.com works on auth.example.com and any subdomain of it (for example, app.auth.example.com, m.auth.example.com).
Avoid using your eTLD+1 (registrable apex) as the rpId — for example, example.com. Setting the rpId at this level lets every subdomain of example.com request and use those passkeys, including marketing sites, third-party-hosted services, or domains operated by other teams. This expands the trust boundary far beyond your authentication surface.
For more information on relying party ID, read:
- Passkeys.dev — Server-side: Relying Party ID for
rpIdselection trade-offs - Web.dev — Choosing the Relying Party ID for browser-side considerations
- FIDO Alliance — User experience guidelines for passkeys for user-facing design patterns
Multi-domain and brand scenarios
If you serve multiple brand domains (e.g.,login.brand1.com and login.brand2.com), passkeys do not automatically work across them — each domain has its own rpId. See Passkeys with Multiple Custom Domains for guidance on per-domain enrollment, communication, and migration patterns.
Configuration checklist
Once you’ve chosen anrpId, ensure all your applications share it:
- Use one custom domain as the
rpIdacross every native and web application that should share passkeys. - For Native Applications, configure Device Settings in the Auth0 Dashboard with your iOS Team ID/App ID and Android package name/SHA-256 fingerprint. Auth0 hosts the
apple-app-site-associationandassetlinks.jsonfiles on your custom domain automatically. - For Web Applications, serve your web origin from the
rpIdor a subdomain of it, and add it to Allowed Web Origins for CORS.
Learn more
The following resources can be referenced when implementing passkey authentication for your application:-
Auth0 APIs
- Authentication API explorer — Passkey authentication endpoints
- My Account API explorer — Passkey enrollment endpoints
- My Account API guide — Activation, scopes, and CORS
- Platform Documentation
-
Additional Resources
- passkeys.dev — Comprehensive passkey implementation guide
- FIDO Alliance UX Guidelines — User experience best practices