FusionAuth developer image
FusionAuth developer logo
  • Back to site
  • Expert Advice
  • Blog
  • Developers
  • Downloads
  • Account
  • Contact sales
Navigate to...
  • Welcome
  • Getting Started
    • Getting Started
    • 5-minute Setup Guide
      • Overview
      • Docker
      • Fast Path
      • Sandbox
    • Setup Wizard & First Login
    • Register a User and Login
    • Self-service Registration
    • Start and Stop FusionAuth
    • Core Concepts
      • Overview
      • Users
      • Roles
      • Groups
      • Registrations
      • Applications
      • Tenants
      • Identity Providers
      • Authentication/Authorization
      • Integration Points
    • Example Apps
      • Overview
      • Dart
      • Go
      • Java
      • JavaScript
      • .NET Core
      • PHP
      • Python
      • Ruby
    • Tutorials
      • Overview
      • Java Spring
      • Python Django
  • Installation Guide
    • Overview
    • System Requirements
    • Server Layout
    • Cloud
    • Cluster
    • Docker
    • Fast Path
    • Kubernetes
      • Overview
      • Deployment Guide
      • Minikube Setup
      • Amazon EKS Setup
      • Google GKE Setup
      • Microsoft AKS Setup
    • Kickstart™
    • Homebrew
    • Marketplaces
    • Packages
    • Database
    • FusionAuth App
    • FusionAuth Search
    • Common Configuration
  • Migration Guide
    • Overview
    • General
    • Auth0
    • Keycloak
    • Amazon Cognito
    • Firebase
    • Microsoft Azure AD B2C
    • Tutorial
  • Admin Guide
    • Overview
    • Account Portal
    • Config Management
    • Editions and Features
    • Key Rotation
    • Licensing
    • Monitoring
    • Prometheus Setup
    • Proxy Setup
    • Reference
      • Overview
      • Configuration
      • CORS
      • Data Types
      • Hosted Login Pages Cookies
      • Known Limitations
      • Password Hashes
    • Releases
    • Roadmap
    • Search And FusionAuth
    • Securing
    • Switch Search Engines
    • Technical Support
    • Troubleshooting
    • Upgrading
    • WebAuthn
  • Login Methods
    • Identity Providers
      • Overview
      • Apple
      • Epic Games
      • External JWT
        • Overview
        • Example
      • Facebook
      • Google
      • HYPR
      • LinkedIn
      • Nintendo
      • OpenID Connect
        • Overview
        • Amazon Cognito
        • Azure AD
        • Discord
        • Github
        • Okta
      • Sony PlayStation Network
      • Steam
      • Twitch
      • Twitter
      • SAML v2
        • Overview
        • ADFS
        • Azure AD
        • Okta
      • SAML v2 IdP Initiated
        • Overview
        • Okta
      • Xbox
    • OIDC & OAuth 2.0
      • Overview
      • Endpoints
      • Tokens
      • OAuth Modes
      • URL Validation
    • Passwordless
      • Overview
      • Magic Links
      • WebAuthn & Passkeys
    • SAML v2 IdP
      • Overview
      • Google
      • PagerDuty
      • Tableau Cloud
      • Zendesk
  • Developer Guide
    • Overview
    • API Gateways
      • Overview
      • Amazon API Gateway
      • Kong Gateway
      • ngrok Cloud Edge
    • Client Libraries & SDKs
      • Overview
      • Dart
      • Go
      • Java
      • JavaScript
      • .NET Core
      • Node
      • OpenAPI
      • PHP
      • Python
      • React
      • Ruby
      • Typescript
    • Events & Webhooks
      • Overview
      • Writing a Webhook
      • Securing Webhooks
      • Events
        • Overview
        • Audit Log Create
        • Event Log Create
        • JWT Public Key Update
        • JWT Refresh
        • JWT Refresh Token Revoke
        • Kickstart Success
        • Group Create
        • Group Create Complete
        • Group Delete
        • Group Delete Complete
        • Group Update
        • Group Update Complete
        • Group Member Add
        • Group Member Add Complete
        • Group Member Remove
        • Group Member Remove Complete
        • Group Member Update
        • Group Member Update Complete
        • User Action
        • User Bulk Create
        • User Create
        • User Create Complete
        • User Deactivate
        • User Delete
        • User Delete Complete
        • User Email Update
        • User Email Verified
        • User IdP Link
        • User IdP Unlink
        • User Login Failed
        • User Login Id Dup. Create
        • User Login Id Dup. Update
        • User Login New Device
        • User Login Success
        • User Login Suspicious
        • User Password Breach
        • User Password Reset Send
        • User Password Reset Start
        • User Password Reset Success
        • User Password Update
        • User Reactivate
        • User Reg. Create
        • User Reg. Create Complete
        • User Reg. Delete
        • User Reg. Delete Complete
        • User Registration Update
        • User Reg. Update Complete
        • User Reg. Verified
        • User 2FA Method Add
        • User 2FA Method Remove
        • User Update
        • User Update Complete
    • Guides
      • Overview
      • Application Specific Email Templates
      • Authentication Tokens
      • Exposing A Local Instance
      • JSON Web Tokens
      • Key Master
      • Localization and Internationalization
      • Multi-Factor Authentication
      • Multi-Tenant
      • Passwordless
      • Registration-based Email Verification
      • Searching With Elasticsearch
      • Securing Your APIs
      • Silent Mode
      • Single Sign-on
      • Two Factor (pre 1.26)
    • Integrations
      • Overview
      • CleanSpeak
      • Kafka
      • Twilio
    • Plugins
      • Overview
      • Writing a Plugin
      • Custom Password Hashing
    • User Control & Gating
      • Overview
      • Gate Unverified Users
      • Gate Unverified Registrations
      • User Account Lockout
  • Customization
    • Email & Templates
      • Overview
      • Configure Email
      • Email Templates
      • Email Variables
      • Message Templates
    • Lambdas
      • Overview
      • Apple Reconcile
      • Client Cred. JWT Populate
      • Epic Games Reconcile
      • External JWT Reconcile
      • Facebook Reconcile
      • Google Reconcile
      • HYPR Reconcile
      • JWT Populate
      • LDAP Connector Reconcile
      • LinkedIn Reconcile
      • Nintendo Reconcile
      • OpenID Connect Reconcile
      • SAML v2 Populate
      • SAML v2 Reconcile
      • SCIM Group Req. Converter
      • SCIM Group Resp. Convtr.
      • SCIM User Req. Converter
      • SCIM User Resp. Converter
      • Self-Service Registration
      • Sony PSN Reconcile
      • Steam Reconcile
      • Twitch Reconcile
      • Twitter Reconcile
      • Xbox Reconcile
    • Messengers
      • Overview
      • Generic Messenger
      • Twilio Messenger
    • Themes
      • Overview
      • Examples
      • Helpers
      • Localization
      • Template Variables
      • Kickstart Custom Theme
  • Premium Features
    • Overview
    • Advanced Registration Forms
    • Advanced Threat Detection
    • Application Specific Themes
    • Breached Password Detection
    • Connectors
      • Overview
      • Generic Connector
      • LDAP Connector
      • FusionAuth Connector
    • Entity Management
    • SCIM
      • Overview
      • Azure AD Client
      • Okta Client
      • SCIM-SDK
    • Self Service Account Mgmt
      • Overview
      • Updating User Data & Password
      • Add Two-Factor Authenticator
      • Add Two-Factor Email
      • Add Two-Factor SMS
      • Add WebAuthn Passkey
      • Customizing
      • Troubleshooting
    • WebAuthn
  • APIs
    • Overview
    • Authentication
    • Errors
    • API Explorer
    • Actioning Users
    • API Keys
    • Applications
    • Audit Logs
    • Connectors
      • Overview
      • Generic
      • LDAP
    • Consents
    • Emails
    • Entity Management
      • Overview
      • Entities
      • Entity Types
      • Grants
    • Event Logs
    • Families
    • Forms
    • Form Fields
    • Groups
    • Identity Providers
      • Overview
      • Links
      • Apple
      • External JWT
      • Epic Games
      • Facebook
      • Google
      • HYPR
      • LinkedIn
      • Nintendo
      • OpenID Connect
      • SAML v2
      • SAML v2 IdP Initiated
      • Sony PlayStation Network
      • Steam
      • Twitch
      • Twitter
      • Xbox
    • Integrations
    • IP Access Control Lists
    • JWT
    • Keys
    • Lambdas
    • Login
    • Message Templates
    • Messengers
      • Overview
      • Generic
      • Twilio
    • Multi-Factor/Two Factor
    • Passwordless
    • Reactor
    • Registrations
    • Reports
    • SCIM
      • Overview
      • SCIM User
      • SCIM Group
      • SCIM EnterpriseUser
      • SCIM Service Provider Config.
    • System
    • Tenants
    • Themes
    • Users
    • User Actions
    • User Action Reasons
    • User Comments
    • WebAuthn
    • Webhooks
  • Release Notes

    WebAuthn APIs

    FusionAuth Reactor logo

    This feature is only available in an Essentials or Enterprise plan. Please visit our pricing page to learn more.

    Overview

    This API has been available since 1.41.0

    This page contains all of the APIs for managing WebAuthn passkeys, sometimes referred to as credentials, and starting and completing WebAuthn ceremonies.

    The following APIs are provided to manage WebAuthn passkeys.

    • Retrieve a Passkey

    • Delete a Passkey

    • Import Passkeys

    WebAuthn Ceremonies

    • WebAuthn JavaScript API Binary Format

    WebAuthn Registration Ceremony

    • Start a WebAuthn Passkey Registration

    • Complete a WebAuthn Passkey Registration

    WebAuthn Authentication Ceremony

    • Start a WebAuthn Passkey Assertion or Authentication

    • Complete a WebAuthn Passkey Authentication

    • Complete a WebAuthn Passkey Assertion

    Retrieve a Passkey

    This API is used to retrieve information about a single WebAuthn passkey or all of a user’s registered passkeys.

    Request

    Retrieve a single Passkey by Id

    URI

    GET /api/webauthn/{id}

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Parameters

    id [UUID] Required

    The unique Id of the WebAuthn passkey to retrieve.

    Retrieve all Passkeys belonging to a User

    URI

    GET /api/webauthn/?userId={userId}

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Parameters

    userId [UUID] Required

    The unique Id of the User to retrieve WebAuthn passkeys for.

    Response

    The response for this API contains either a single Passkey or all of the Passkeys belonging to a User. When you call this API with an Id, the response will contain just that Passkey. When you call this API without an Id and provide a User Id in the query string, the response will contain all of the Passkeys belonging to that User. Both response types are defined below along with an example JSON response.

    Table 1. Response Codes
    Code Description

    200

    The request was successful. The response will contain a JSON body.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    401

    You did not supply a valid Authorization header. The header was omitted or your API key was not valid. The response will be empty. See Authentication.

    404

    The object you requested doesn’t exist. The response will be empty.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Response Body

    credential.algorithm [Long]

    The identifier for the signing algorithm used with the passkey. These values are defined by the IANA COSE Algorithms registry. FusionAuth supports a subset of these algorithms.

    Table 2. Supported algorithms
    Name Value Description

    RS256

    -257

    RSASSA-PKCS1-v1_5 using SHA-256

    RS384

    -258

    RSASSA-PKCS1-v1_5 using SHA-384

    RS512

    -259

    RSASSA-PKCS1-v1_5 using SHA-512

    PS256

    -37

    RSASSA-PSS w/ SHA-256

    PS384

    -38

    RSASSA-PSS w/ SHA-384

    PS512

    -39

    RSASSA-PSS w/ SHA-512

    ES256

    -7

    ECDSA w/ SHA-256

    ES384

    -35

    ECDSA w/ SHA-384

    ES512

    -36

    ECDSA w/ SHA-512

    credential.attestationType [String]

    The type of attestation provided when the passkey was registered. Passkeys registered in FusionAuth will have a value of none. Imported passkeys may have another value.

    credential.authenticatorSupportsUserVerification [Boolean]

    Indicates whether this authenticator supports user verification. User verification ensures that the user is authorized to use the authenticator.

    This value is currently determined by whether user verification occurred during the registration of this passkey rather than by other means, such as examining FIDO authenticator metadata.

    credential.credentialId [String]

    The credential Id generated by the authenticator is stored as a base64url-encoded string. This value is used by authenticators to look up a passkey during an authentication ceremony and to prevent multiple passkeys from being registered on the same authenticator for a single user.

    credential.data [Object]

    An object that can hold any information about the passkey that should be persisted.

    credential.discoverable [Boolean]

    Indicates whether the passkey is "client-side discoverable." Discoverable passkeys can be used in authentication ceremonies without first identifying the user (e.g. by requiring the user to complete a form field).

    credential.displayName [String]

    The display name for the passkey selected during registration. This value should have been selected by the user.

    credential.id [UUID]

    The unique identifier for this passkey.

    credential.insertInstant [Long]

    The instant that the passkey was added to the FusionAuth database.

    credential.lastUseInstant [Long]

    The instant that the passkey was last used to complete a WebAuthn ceremony.

    credential.name [String]

    A unique name meant to disambiguate passkeys with the same credential.displayName.

    credential.publicKey [String]

    The passkey’s public key, encoded in PEM format.

    credential.relyingPartyId [String]

    The Relying Party Id used at the time the passkey was registered.

    credential.signCount [Integer]

    A signature counter for the passkey. The signature count can be used by a Relying Party to identify a cloned or malfunctioning authenticator.

    credential.tenantId [UUID]

    The Id of the tenant to which this passkey belongs.

    credential.transports [List<String>]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify eligible authenticators during a WebAuthn ceremony.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    credential.userAgent [String]

    The user agent at the time the passkey was registered. This can be useful for troubleshooting purposes.

    credential.userId [UUID]

    The Id of the user that this passkey belongs to.

    Example Response JSON
    
    {
      "credential": {
        "algorithm": -7,
        "attestationType": "none",
        "authenticatorSupportsUserVerification": true,
        "credentialId": "HdN9wqP9mqOonacmiM2gIjASFYg",
        "data": {},
        "displayName": "Chrome Touch ID",
        "name": "richard@fusionauth.io",
        "id": "c664318a-2384-4c35-9475-9a200e1d3b72",
        "insertInstant": 1668011701792,
        "discoverable": false,
        "lastUseInstant": 1668021630599,
        "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz9DI9AQfZn1aDJG5sw3Ckl7SoQ7E\nLPElDoJMijphvVigTcNMTc8H9Xptl8B20QHMOXGTzaUxLGNY1c8yhw9VVA==\n-----END PUBLIC KEY-----",
        "relyingPartyId": "piedpiper.com",
        "signCount": 41,
        "tenantId": "30663132-6464-6665-3032-326466613934",
        "transports": [
          "internal"
        ],
        "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
      }
    }

    Response Body

    credentials[x] [Array]

    The list of WebAuthn Passkey objects.

    credentials[x].algorithm [Long]

    The identifier for the signing algorithm used with the passkey. These values are defined by the IANA COSE Algorithms registry. FusionAuth supports a subset of these algorithms.

    Table 3. Supported algorithms
    Name Value Description

    RS256

    -257

    RSASSA-PKCS1-v1_5 using SHA-256

    RS384

    -258

    RSASSA-PKCS1-v1_5 using SHA-384

    RS512

    -259

    RSASSA-PKCS1-v1_5 using SHA-512

    PS256

    -37

    RSASSA-PSS w/ SHA-256

    PS384

    -38

    RSASSA-PSS w/ SHA-384

    PS512

    -39

    RSASSA-PSS w/ SHA-512

    ES256

    -7

    ECDSA w/ SHA-256

    ES384

    -35

    ECDSA w/ SHA-384

    ES512

    -36

    ECDSA w/ SHA-512

    credentials[x].attestationType [String]

    The type of attestation provided when the passkey was registered. Passkeys registered in FusionAuth will have a value of none. Imported passkeys may have another value.

    credentials[x].authenticatorSupportsUserVerification [Boolean]

    Indicates whether this authenticator supports user verification. User verification ensures that the user is authorized to use the authenticator.

    This value is currently determined by whether user verification occurred during the registration of this passkey rather than by other means, such as examining FIDO authenticator metadata.

    credentials[x].credentialId [String]

    The credential Id generated by the authenticator is stored as a base64url-encoded string. This value is used by authenticators to look up a passkey during an authentication ceremony and to prevent multiple passkeys from being registered on the same authenticator for a single user.

    credentials[x].data [Object]

    An object that can hold any information about the passkey that should be persisted.

    credentials[x].discoverable [Boolean]

    Indicates whether the passkey is "client-side discoverable." Discoverable passkeys can be used in authentication ceremonies without first identifying the user (e.g. by requiring the user to complete a form field).

    credentials[x].displayName [String]

    The display name for the passkey selected during registration. This value should have been selected by the user.

    credentials[x].id [UUID]

    The unique identifier for this passkey.

    credentials[x].insertInstant [Long]

    The instant that the passkey was added to the FusionAuth database.

    credentials[x].lastUseInstant [Long]

    The instant that the passkey was last used to complete a WebAuthn ceremony.

    credentials[x].name [String]

    A unique name meant to disambiguate passkeys with the same credential.displayName.

    credentials[x].publicKey [String]

    The passkey’s public key, encoded in PEM format.

    credentials[x].relyingPartyId [String]

    The Relying Party Id used at the time the passkey was registered.

    credentials[x].signCount [Integer]

    A signature counter for the passkey. The signature count can be used by a Relying Party to identify a cloned or malfunctioning authenticator.

    credentials[x].tenantId [UUID]

    The Id of the tenant to which this passkey belongs.

    credentials[x].transports [List<String>]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify eligible authenticators during a WebAuthn ceremony.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    credentials[x].userAgent [String]

    The user agent at the time the passkey was registered. This can be useful for troubleshooting purposes.

    credentials[x].userId [UUID]

    The Id of the user that this passkey belongs to.

    Example Response JSON
    
    {
      "credentials": [
        {
          "algorithm": -7,
          "attestationType": "none",
          "authenticatorSupportsUserVerification": true,
          "credentialId": "HdN9wqP9mqOonacmiM2gIjASFYg",
          "data": {},
          "displayName": "Chrome Touch ID",
          "name": "richard@fusionauth.io",
          "id": "c664318a-2384-4c35-9475-9a200e1d3b72",
          "insertInstant": 1668011701792,
          "discoverable": false,
          "lastUseInstant": 1668021630599,
          "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz9DI9AQfZn1aDJG5sw3Ckl7SoQ7E\nLPElDoJMijphvVigTcNMTc8H9Xptl8B20QHMOXGTzaUxLGNY1c8yhw9VVA==\n-----END PUBLIC KEY-----",
          "relyingPartyId": "piedpiper.com",
          "signCount": 41,
          "tenantId": "30663132-6464-6665-3032-326466613934",
          "transports": [
            "internal"
          ],
          "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
        }
      ]
    }

    Delete a Passkey

    This API is used to delete a single WebAuthn passkey or all of a user’s registered passkeys.

    Request

    Delete a single Passkey by Id

    URI

    DELETE /api/webauthn/{id}

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Parameters

    id [UUID] Required

    The unique Id of the WebAuthn passkey to delete.

    Delete all Passkeys belonging to a User

    URI

    DELETE /api/webauthn/?userId={userId}

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Parameters

    userId [UUID] Required

    The unique Id of the User to delete WebAuthn passkeys for.

    Response

    This API does not return a JSON response body.

    Table 4. Response Codes
    Code Description

    200

    The request was successful. The response will be empty.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    401

    You did not supply a valid Authorization header. The header was omitted or your API key was not valid. The response will be empty. See Authentication.

    404

    The object you are trying to delete doesn’t exist. The response will be empty.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Import Passkeys

    This API is used to bulk import multiple passkeys into FusionAuth. Reasonable defaults are provided for optional fields. This request is useful for migrating data from an existing database into FusionAuth.

    Request

    Import Multiple Passkeys

    URI

    POST /api/webauthn/import

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request. The tenant Id is not required on this request when only one tenant has been configured. If there is more than one tenant, the tenant Id is required.

    Supply the tenant Id via this header or by using an API Key scoped to a tenant, which implicitly supplies the tenant Id.

    See Making an API request using a Tenant Id for additional information.

    Request Body

    credentials [Array] Required

    The list of passkeys to import.

    credentials[x].algorithm [Long] Required

    The identifier for the signing algorithm used with the passkey. These values are defined by the IANA COSE Algorithms registry. FusionAuth supports a subset of these algorithms.

    Table 5. Supported algorithms
    Name Value Description

    RS256

    -257

    RSASSA-PKCS1-v1_5 using SHA-256

    RS384

    -258

    RSASSA-PKCS1-v1_5 using SHA-384

    RS512

    -259

    RSASSA-PKCS1-v1_5 using SHA-512

    PS256

    -37

    RSASSA-PSS w/ SHA-256

    PS384

    -38

    RSASSA-PSS w/ SHA-384

    PS512

    -39

    RSASSA-PSS w/ SHA-512

    ES256

    -7

    ECDSA w/ SHA-256

    ES384

    -35

    ECDSA w/ SHA-384

    ES512

    -36

    ECDSA w/ SHA-512

    credentials[x].attestationType [String] Optional defaults to none

    The attestation type provided when the passkey was registered. FusionAuth doesn’t validate the attestation on import. Supported values are:

    • anonymization-ca

    • attestation-ca

    • basic

    • none

    • self

    Passkeys registered in FusionAuth currently only support the none option, but another value can be supplied during passkey import.

    credentials[x].authenticatorSupportsUserVerification [Boolean] Optional defaults to false

    Indicates whether this authenticator supports user verification. User verification ensures that the user is authorized to use the authenticator.

    credentials[x].credentialId [String] Required

    The credential Id generated by the authenticator is stored as a base64url-encoded string. This value is used by authenticators to look up a passkey during an authentication ceremony.

    credentials[x].data [Object] Optional

    An object that can hold any information about the passkey that should be persisted.

    credentials[x].discoverable [Boolean] Optional defaults to false

    Indicates whether the passkey is "client-side discoverable." Discoverable passkeys can be used in authentication ceremonies without first identifying the user (e.g. by requiring the user to provide their username).

    credentials[x].displayName [String] Required

    The display name for the passkey.

    credentials[x].id [UUID] Optional defaults to secure random UUID

    The Id of the passkey. If not specified a secure random UUID will be generated.

    credentials[x].insertInstant [Long] Optional defaults to now

    The instant when the passkey was created.

    credentials[x].lastUseInstant [Long] Optional defaults to now

    The instant when the passkey was last used.

    credentials[x].name [String] Required

    A unique name meant to disambiguate passkeys with the same credential.displayName.

    Prior to version 1.42.0 this field was optional.

    credentials[x].publicKey [String] Required

    The passkey’s public key, encoded in PEM format.

    credentials[x].relyingPartyId [String] Required

    The Relying Party Id used at the time the passkey was registered.

    This value must match the rpId value when the passkey was created, and the browser origin during WebAuthn authentication in FusionAuth must be compatible with that Relying Party Id.

    credentials[x].signCount [Integer] Optional defaults to 0

    The last known signature count for the passkey.

    credentials[x].transports [List<String>] Optional defaults to [ ]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint during the WebAuthn authentication ceremony to help identify eligible authenticators.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    The default value is the empty set, which means that no hints are provided. This does not negatively impact the authentication ceremony.

    credentials[x].userAgent [String] Optional

    The user agent at the time the passkey was registered. This can be useful for troubleshooting WebAuthn passkey issues.

    credentials[x].userId [UUID] Required

    The Id of the user to which this passkey belongs.

    validateDbConstraints [Boolean] Optional defaults to false

    Set this value to true in order to perform additional validation of the request.

    The import request is intended to be used to migrate existing users' passkeys from one system to another, this means FusionAuth expects all user Ids from the request to exist for the provided tenant. If a non-existent user Id is encountered a 500 will be returned unless this field is set to true.

    In order to get additional details about database constraint violations on import, set this value to true and a 400 response will be returned with a JSON body indicating the missing values encountered.

    Setting this value to true will dramatically decrease the performance of this request. If importing large numbers of passkeys in a single request you may need to increase request timeouts to ensure this request does not timeout before it has completed.

    Example Request JSON
    
    {
      "credentials": [
        {
          "algorithm": -7,
          "credentialId": "vBD52q2FMMM-zxaO-ZMgrN3ewjbmb0ra5E-QCX_3kz0",
          "displayName": "YubiKey",
          "name": "richard@fusionauth.io",
          "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz9DI9AQfZn1aDJG5sw3Ckl7SoQ7E\nLPElDoJMijphvVigTcNMTc8H9Xptl8B20QHMOXGTzaUxLGNY1c8yhw9VVA==\n-----END PUBLIC KEY-----",
          "relyingPartyId": "piedpiper.com",
          "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
        },
        {
          "algorithm": -7,
          "attestationType": "none",
          "authenticatorSupportsUserVerification": true,
          "credentialId": "HdN9wqP9mqOonacmiM2gIjASFYg",
          "data": {},
          "displayName": "Chrome Touch ID",
          "name": "richard@fusionauth.io",
          "id": "c664318a-2384-4c35-9475-9a200e1d3b72",
          "insertInstant": 1668011701792,
          "discoverable": false,
          "lastUseInstant": 1668021630599,
          "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz9DI9AQfZn1aDJG5sw3Ckl7SoQ7E\nLPElDoJMijphvVigTcNMTc8H9Xptl8B20QHMOXGTzaUxLGNY1c8yhw9VVA==\n-----END PUBLIC KEY-----",
          "relyingPartyId": "piedpiper.com",
          "signCount": 41,
          "transports": [
            "internal"
          ],
          "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
        }
      ]
    }

    Response

    Only a status code is available on the Import API, no JSON body will be returned.

    Table 6. Response Codes
    Code Description

    200

    The request was successful. The response will contain a JSON body.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    401

    You did not supply a valid Authorization header. The header was omitted or your API key was not valid. The response will be empty. See Authentication.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    WebAuthn JavaScript API Binary Format

    The WebAuthn JavaScript API navigator.credentials.create() and navigator.credentials.get() expect to receive fields containing binary data on the options object as a JavaScript ArrayBuffer and will return binary fields as ArrayBuffers. In order to prevent encoding issues on the FusionAuth API, these fields are passed over the network as base64url-encoded strings.

    Select fields on the options JSON object that is passed to the WebAuthn JavaScript API must be converted from base64url-encoded strings to ArrayBuffers after receiving options from the FusionAuth API. Likewise, certain fields on WebAuthn JavaScript API responses must be converted from ArrayBuffers to base64url-encoded strings before calling FusionAuth’s APIs to complete the ceremony.

    Converting base64url-encoded String to ArrayBuffer

    Converting a base64url-encoded strings to ArrayBuffers is required before the options JSON object from Start a WebAuthn Passkey Registration or Start a WebAuthn Passkey Assertion or Authentication responses are passed to the WebAuthn JavaScript API. The FusionAuth hosted pages will perform this conversion as necessary. If you need to perform this conversion yourself, you can use the following JavaScript function.

    Function to convert a base64url-encoded string to an ArrayBuffer
    
    function base64URLToBuffer(base64URL) {
      const base64 = base64URL.replace(/-/g, '+').replace(/_/g, '/');
      const padLen = (4 - (base64.length % 4)) % 4;
      return Uint8Array.from(atob(base64.padEnd(base64.length + padLen, '=')), c => c.charCodeAt(0));
    }

    Fields that require this conversion are documented in the Start a WebAuthn Passkey Registration and Start a WebAuthn Passkey Assertion or Authentication response sections.

    Converting ArrayBuffer to base64url-encoded String

    Converting ArrayBuffers to base64url-encoded strings is required before the responses from the WebAuthn JavaScript APIs are sent to FusionAuth’s Complete a WebAuthn Passkey Registration, Complete a WebAuthn Passkey Authentication, or Complete a WebAuthn Passkey Assertion APIs. The FusionAuth hosted pages will perform this conversion as necessary. If you need to perform this conversion yourself, you can use the following JavaScript function.

    Function to convert an ArrayBuffer to a base64url-encoded string
    
    function bufferToBase64URL(buffer) {
      const bytes = new Uint8Array(buffer);
      let string = '';
      bytes.forEach(b => string += String.fromCharCode(b));
    
      const base64 = btoa(string);
      return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
    }

    Fields that require this conversion are documented in the Complete a WebAuthn Passkey Registration, Complete a WebAuthn Passkey Authentication, and Complete a WebAuthn Passkey Assertion request sections.

    Start a WebAuthn Passkey Registration

    This API is used to start a WebAuthn registration ceremony by providing some details about the current user and the new passkey. The response is a JSON object which is suitable to be passed to the WebAuthn JavaScript API navigator.credentials.create() function and includes a one-time challenge unique to the current registration ceremony.

    Request

    Start a WebAuthn Registration Ceremony and Retrieve Passkey Creation Options

    URI

    POST /api/webauthn/register/start

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Body

    displayName [String] Required

    The primary display name for the new passkey.

    name [String] Optional defaults to [see description]

    The optional name for the passkey. This is meant to disambiguate passkeys with the same displayName. When this parameter is omitted, it will be defaulted to the user’s email address. If the user does not have an email address, this parameter will be defaulted to their username instead.

    Prior to version 1.42.0 name was defaulted to a random four character alphanumeric string.

    The passkey name is set at the time the passkey is registered. There is currently no way to change the name of the passkey. Prompts displayed by the WebAuthn JavaScript API will continue to display the original value at the time the passkey was registered even if the user updates their email address or username. In order to display the updated email or username the user must register a new passkey.

    userAgent [String] Optional

    The user’s browser’s user agent string. This value is meant for troubleshooting issues with passkeys.

    userId [UUID] Required

    The Id of the user registering the passkey.

    workflow [String] Required

    The WebAuthn workflow this passkey is intended to be used with. Selecting the proper value will provide the best user experience by limiting the registration ceremony to authenticators which support the features needed for each workflow. The selected workflow will change the creation options on the response based on the tenant configuration. The possible values are:

    • bootstrap - The passkey is intended for use with the bootstrap workflow, which requires the user to "bootstrap" the authentication process by identifying themselves prior to the WebAuthn ceremony and can be used to authenticate from a new device using WebAuthn.

    • general - The passkey is not intended for any particular workflow. This value will allow for the most flexible use of the new passkey.

    • reauthentication - The passkey is intended for use with the re-authentication workflow, which provides a streamlined user experience for repeated logins from the same device.

    Example Request JSON
    
    {
      "displayName": "Chrome Touch ID",
      "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457",
      "workflow": "reauthentication"
    }

    Response

    Table 7. Response Codes
    Code Description

    200

    The request was successful. The response will contain a JSON body.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    401

    You did not supply a valid Authorization header. The header was omitted or your API key was not valid. The response will be empty. See Authentication.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Response Body

    The response body contains options to be passed to the WebAuthn JavaScript API. The options.challenge, options.user.id, and options.excludeCredentials[x].id fields must be converted to ArrayBuffers for the navigator.credentials.create() request. See WebAuthn JavaScript API Binary Format for details.

    options [Object]

    The WebAuthn public key credential creation options. This object is passed to the WebAuthn JavaScript API to create a new passkey.

    options.attestation [String]

    The Relying Party’s attestation conveyance preference. Currently supported values include:

    • none - The Relying Party is not interested in authenticator attestation.

    options.authenticatorSelection.authenticatorAttachment [String]

    The Relying Party’s authenticator attachment preference. Authenticators eligible for the current registration ceremony will be limited according to this requested attachment preference. Possible values are:

    • platform - The authenticator is integrated with the current device. These typically use the device’s unlock mechanism for user verification (e.g. Touch ID, PIN, pattern).

    • cross-platform - The authenticator can be used between multiple devices such as a USB security key or Bluetooth-connected phone.

    • null (or omitted) - The Relying Party has no attachment preference. Any attachment will be allowed.

    options.authenticatorSelection.userVerification [String]

    The Relying Party’s user verification requirement. Eligible authenticators will be filtered according to this preference. Possible values are:

    • discouraged - The Relying Party does not want user verification to be used.

    • preferred - The Relying Party prefers that user verification is used if available but will not fail the ceremony if it is not provided.

    • required - The Relying Party requires user verification for the operation.

    options.challenge [String]

    This field contains a base64url-encoded string that acts as a one-time challenge for the ceremony. This makes WebAuthn resistant to certain kinds of replay attacks.

    See Converting base64url-encoded String to ArrayBuffer for details on converting this value for the WebAuthn JavaScript API call.

    options.excludeCredentials [Array]

    A list of passkeys whose generating authenticators should be excluded from the current registration ceremony. This is meant to prevent a user creating multiple passkeys for the same account on the same authenticator.

    options.excludeCredentials[x].id [String]

    The credential Id generated by the authenticator as a base64url-encoded string. An available authenticator that owns any passkey with one of these Ids is excluded from the current ceremony.

    See Converting base64url-encoded String to ArrayBuffer for details on converting these values for the WebAuthn JavaScript API call.

    options.excludeCredentials[x].transports [List<String>]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify authenticators containing one of the options.excludeCredentials.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    options.excludeCredentials[x].type [String]

    The credential type the current passkey refers to. The only value supported by WebAuthn is public-key.

    options.extensions.credProps [Boolean]

    If true, the Relying Party will request the client to report on whether the new passkey is a client-side discoverable credential.

    options.pubKeyCredParams [Array]

    A list of the Relying Party’s acceptable options for the type of passkey and its signing algorithm in order of preference.

    options.pubKeyCredParams[x].alg [Long]

    The identifier for the signing algorithm to be used with the passkey. These values are defined by the IANA COSE Algorithms registry. FusionAuth supports a subset of these algorithms.

    options.pubKeyCredParams[x].type [String]

    The credential type the current passkey refers to. The only value supported by WebAuthn is public-key.

    options.rp.id [String]

    The Relying Party Id for this registration ceremony. Passkeys can only be used to authenticate on sites using the same Relying Party Id they were registered with.

    If this value is null or omitted, the WebAuthn JavaScript API will use the browser origin as the Relying Party Id.

    options.rp.name [String]

    The name of the Relying Party requesting a new passkey to be created. This value is intended for display during WebAuthn ceremonies.

    options.timeout [Long]

    The number of milliseconds the Relying Party is willing to wait for the ceremony to complete. This value is treated as a hint and may be overridden by the client. This is an unsigned value.

    options.user.displayName [String]

    A human-readable display name for the new passkey. This value may be displayed during the current and future WebAuthn ceremonies.

    options.user.id [String]

    A user handle that can be used by the Relying Party to uniquely identify the user registering the passkey. FusionAuth uses the base64url-encoded unique Id for the user.

    See Converting base64url-encoded String to ArrayBuffer for details on converting this value for the WebAuthn JavaScript API call.

    options.user.name [String]

    A human-readable name for the passkey intended for display. This value is meant to disambiguate between passkeys with a similar displayName.

    Example Response JSON
    
    {
      "options": {
        "attestation": "none",
        "authenticatorSelection": {
          "authenticatorAttachment": "platform",
          "userVerification": "required"
        },
        "challenge": "fdnW2u1_Nk9_FY2SprU4mPs0NgBTbo9tOO5Q9EvO1Oc",
        "excludeCredentials": [
          {
            "id": "MBU0eBsaNAt4VEh4Lbn2sQ==",
            "transports": [
              "internal"
            ],
            "type": "public-key"
          }
        ],
        "extensions": {
          "credProps": true
        },
        "pubKeyCredParams": [
          {
            "alg": -36,
            "type": "public-key"
          },
          {
            "alg": -35,
            "type": "public-key"
          },
          {
            "alg": -7,
            "type": "public-key"
          },
          {
            "alg": -39,
            "type": "public-key"
          },
          {
            "alg": -38,
            "type": "public-key"
          },
          {
            "alg": -37,
            "type": "public-key"
          },
          {
            "alg": -259,
            "type": "public-key"
          },
          {
            "alg": -258,
            "type": "public-key"
          },
          {
            "alg": -257,
            "type": "public-key"
          }
        ],
        "rp": {
          "id": "piedpiper.com",
          "name": "Pied Piper"
        },
        "timeout": 180000,
        "user": {
          "displayName": "Chrome Touch ID",
          "id": "NzAzZmUyZDItMmQzOS00Y2I3LWI3NmQtMGI5OTE4ZWQyNDU3",
          "name": "richard@fusionauth.io"
        }
      }
    }

    Complete a WebAuthn Passkey Registration

    This API is used to complete a WebAuthn registration ceremony by providing the values returned from the WebAuthn JavaScript API call. The API will validate the request against configured passkey requirements for the workflow and the one-time challenge generated and returned by Start a WebAuthn Passkey Registration.

    Request

    Complete a WebAuthn Registration Ceremony and Return Passkey Details

    URI

    POST /api/webauthn/register/complete

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Body

    The credential in the request body contains data returned by the WebAuthn JavaScript API call. The credential.response.attestationObject and credential.response.clientDataJSON fields must be converted to base64url-encoded strings for the FusionAuth API request. See WebAuthn JavaScript API Binary Format for details.

    credential.clientExtensionResults.credProps.rk [Boolean] Optional

    If true, the new passkey is "client-side discoverable," meaning that it can be used in authentication ceremonies without first identifying the user (e.g. by requiring the user to complete a form field). If false, or the credential.clientExtensionResults.credProps field is omitted, the passkey should be treated as if it were not client-side discoverable. FusionAuth does not currently support discoverable credentials (sometimes referred to as "resident keys").

    credential.id [String] Required

    A base64url-encoded version of the credential Id generated by the authenticator for this passkey.

    credential.rpId [String] Optional

    If the tenant configuration overrides the Relying Party Id, this parameter should match tenant.webAuthnConfiguration.relyingPartyId, otherwise the value should be omitted from the request object.

    credential.response.attestationObject [String] Required

    The base64url-encoded attestation data from the WebAuthn JavaScript API response, which includes information on the new passkey and other data important for validation. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.clientDataJSON [String] Required

    The base64url-encoded client data from the WebAuthn JavaScript API response. This contains important information for the WebAuthn registration validation process, including the one-time challenge generated when the registration ceremony began. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.transports [List<String>] Optional

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify eligible authenticators during a WebAuthn ceremony.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    credential.type [String] Required

    The credential type of the new passkey. The only value supported by WebAuthn is public-key.

    origin [String] Required

    The browser request origin during the registration ceremony.

    rpId [String] Required

    If the tenant configuration overrides the Relying Party Id, this parameter should match tenant.webAuthnConfiguration.relyingPartyId, otherwise the value should be the browser request origin’s effective domain during the ceremony.

    userId [UUID] Required

    The unique Id of the user registering this new passkey.

    Example Request JSON
    
    {
      "credential": {
        "clientExtensionResults": {
          "credProps": {
            "rk": true
          }
        },
        "id": "HdN9wqP9mqOonacmiM2gIjASFYg",
        "response": {
          "attestationObject": "v2dhdHRTdG109mhhdXRoRGF0YViemPsv4VW-wth0V9gzsxWRFn-1SyC9gM4-QC4ptMFDNhVFAAAAFmhGAxjmXUwbl-q5EoJkWH0AELmJieDlA5kNXEtcIgWnp1a_YTMmYTECYi0xAWItMlggTmZZ1aeY0PP8-Ebdufqcg9TWEs_mJaFJmJ57uRyQ1BxiLTNYIQCzqsN1dkCeZKpWGKEVP0-eqBlkKGNCjfcdg5221SRZX_9jZm10ZG5vbmX_",
          "clientDataJSON": "eyJjaGFsbGVuZ2UiOiJ2dHk0WG1ES01EMmxTc2dVOEpsOFlIVEtBcGZlWXpMdkRVUksxTXpGd1JvIiwiY3Jvc3NPcmlnaW4iOmZhbHNlLCJvcmlnaW4iOiJodHRwczovL2Z1c2lvbmF1dGguaW8iLCJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIn0="
        },
        "transports": [
          "internal"
        ],
        "type": "public-key"
      },
      "origin": "https://auth.piedpiper.com",
      "rpId": "piedpiper.com",
      "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
    }

    Response

    Table 8. Response Codes
    Code Description

    200

    The request was successful. The response will contain a JSON body.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Response Body

    credential.algorithm [Long]

    The identifier for the signing algorithm used with the passkey. These values are defined by the IANA COSE Algorithms registry. FusionAuth supports a subset of these algorithms.

    Table 9. Supported algorithms
    Name Value Description

    RS256

    -257

    RSASSA-PKCS1-v1_5 using SHA-256

    RS384

    -258

    RSASSA-PKCS1-v1_5 using SHA-384

    RS512

    -259

    RSASSA-PKCS1-v1_5 using SHA-512

    PS256

    -37

    RSASSA-PSS w/ SHA-256

    PS384

    -38

    RSASSA-PSS w/ SHA-384

    PS512

    -39

    RSASSA-PSS w/ SHA-512

    ES256

    -7

    ECDSA w/ SHA-256

    ES384

    -35

    ECDSA w/ SHA-384

    ES512

    -36

    ECDSA w/ SHA-512

    credential.attestationType [String]

    The type of attestation provided when the passkey was registered. Passkeys registered in FusionAuth will have a value of none. Imported passkeys may have another value.

    credential.authenticatorSupportsUserVerification [Boolean]

    Indicates whether this authenticator supports user verification. User verification ensures that the user is authorized to use the authenticator.

    This value is currently determined by whether user verification occurred during the registration of this passkey rather than by other means, such as examining FIDO authenticator metadata.

    credential.credentialId [String]

    The credential Id generated by the authenticator is stored as a base64url-encoded string. This value is used by authenticators to look up a passkey during an authentication ceremony and to prevent multiple passkeys from being registered on the same authenticator for a single user.

    credential.data [Object]

    An object that can hold any information about the passkey that should be persisted.

    credential.discoverable [Boolean]

    Indicates whether the passkey is "client-side discoverable." Discoverable passkeys can be used in authentication ceremonies without first identifying the user (e.g. by requiring the user to complete a form field).

    credential.displayName [String]

    The display name for the passkey selected during registration. This value should have been selected by the user.

    credential.id [UUID]

    The unique identifier for this passkey.

    credential.insertInstant [Long]

    The instant that the passkey was added to the FusionAuth database.

    credential.lastUseInstant [Long]

    The instant that the passkey was last used to complete a WebAuthn ceremony.

    credential.name [String]

    A unique name meant to disambiguate passkeys with the same credential.displayName.

    credential.publicKey [String]

    The passkey’s public key, encoded in PEM format.

    credential.relyingPartyId [String]

    The Relying Party Id used at the time the passkey was registered.

    credential.signCount [Integer]

    A signature counter for the passkey. The signature count can be used by a Relying Party to identify a cloned or malfunctioning authenticator.

    credential.tenantId [UUID]

    The Id of the tenant to which this passkey belongs.

    credential.transports [List<String>]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify eligible authenticators during a WebAuthn ceremony.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    credential.userAgent [String]

    The user agent at the time the passkey was registered. This can be useful for troubleshooting purposes.

    credential.userId [UUID]

    The Id of the user that this passkey belongs to.

    Example Response JSON
    
    {
      "credential": {
        "algorithm": -7,
        "attestationType": "none",
        "authenticatorSupportsUserVerification": true,
        "credentialId": "HdN9wqP9mqOonacmiM2gIjASFYg",
        "data": {},
        "displayName": "Chrome Touch ID",
        "name": "richard@fusionauth.io",
        "id": "c664318a-2384-4c35-9475-9a200e1d3b72",
        "insertInstant": 1668011701792,
        "discoverable": false,
        "lastUseInstant": 1668021630599,
        "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz9DI9AQfZn1aDJG5sw3Ckl7SoQ7E\nLPElDoJMijphvVigTcNMTc8H9Xptl8B20QHMOXGTzaUxLGNY1c8yhw9VVA==\n-----END PUBLIC KEY-----",
        "relyingPartyId": "piedpiper.com",
        "signCount": 41,
        "tenantId": "30663132-6464-6665-3032-326466613934",
        "transports": [
          "internal"
        ],
        "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
      }
    }

    Start a WebAuthn Passkey Assertion or Authentication

    This API is used to start a WebAuthn authentication ceremony by providing some details about the current user and the new passkey. The response is a JSON object which is suitable to be passed to the WebAuthn JavaScript API navigator.credentials.get() function and includes a one-time challenge unique to the current ceremony. This same API is used to start a WebAuthn assertion that validates a passkey signature without authenticating the user.

    Request

    Start a WebAuthn Authentication Ceremony and Retrieve Passkey Request Options

    URI

    POST /api/webauthn/start

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Body

    applicationId [UUID] Required

    The Id for the application to which the user wishes to authenticate.

    credentialId [UUID] Optional

    The unique database Id for one of a user’s passkeys. When provided, the authentication ceremony will use this passkey. Otherwise, any of a user’s passkeys that meet the user verification requirement will be eligible for the authentication ceremony.

    loginId [String] Optional

    The email or the username of the authenticating user.

    Required if userId is not present. If both fields are provided in the request body, the userId will be utilized.

    state [Object] Optional

    An optional object that will be returned un-modified when you complete the WebAuthn authentication request. This may be useful to return the user to a particular state once they complete the authentication.

    userId [UUID] Optional

    The unique Id of the authenticating user.

    This field is marked optional, but you must provide either the loginId or the userId to complete this API. If both fields are provided in the request body, the userId will be utilized.

    workflow [String] Required

    The WebAuthn workflow for the current authentication ceremony. The workflow value changes the options object generated by this API. The options object is built to be passed to the WebAuthn JavaScript API call. The possible values are:

    • bootstrap - The user is authenticating using a WebAuthn passkey after providing their email, username, or other information to identify themselves.

    • reauthentication - The user is reauthenticating on a device they have previously authenticated from.

    Example Request JSON
    
    {
      "applicationId": "82b24314-95f6-4393-b3da-72c341185244",
      "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457",
      "workflow": "reauthentication"
    }

    Response

    Table 10. Response Codes
    Code Description

    200

    The request was successful. The response will contain a JSON body.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    401

    You did not supply a valid Authorization header. The header was omitted or your API key was not valid. The response will be empty. See Authentication.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Response Body

    The response body contains options to be passed to the WebAuthn JavaScript API. The options.challenge and options.allowCredentials[x].id fields must be converted to ArrayBuffers for the navigator.credentials.get() request. See WebAuthn JavaScript API Binary Format for details.

    options [Object]

    The WebAuthn public key credential request options. This object is passed to the WebAuthn JavaScript API to generate an assertion using an available passkey.

    options.allowCredentials [Array]

    An array containing identifying information for passkeys that are allowed to complete this authentication ceremony, ordered from most to least preferred.

    options.allowCredentials[x].id [String]

    The credential Id generated by the authenticator as a base64url-encoded string. This value is used to locate an authenticator that can complete the ceremony.

    See Converting base64url-encoded String to ArrayBuffer for details on converting these values for the WebAuthn JavaScript API call.

    options.allowCredentials[x].transports [List<String>]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify authenticators containing one of the options.allowCredentials.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    options.allowCredentials[x].type [String]

    The credential type the current passkey refers to. The only value supported by WebAuthn is public-key.

    options.challenge [String]

    This field contains a base64url-encoded string that acts as a one-time challenge for the ceremony. This makes WebAuthn resistant to certain kinds of replay attacks.

    See Converting base64url-encoded String to ArrayBuffer for details on converting this value for the WebAuthn JavaScript API call.

    options.rpId [String]

    The Relying Party Id for this authentication ceremony. Passkeys can only be used to authenticate on sites with the same Relying Party Id with which the passkeys were registered.

    If this value is null or omitted, the WebAuthn JavaScript API will use the browser origin as the Relying Party Id.

    options.timeout [Long]

    The number of milliseconds the Relying Party is willing to wait for the ceremony to complete. This value is treated as a hint and may be overridden by the client. This is an unsigned value.

    options.userVerification [String]

    The Relying Party’s user verification requirement. Eligible authenticators will be filtered according to this preference. Possible values are:

    • discouraged - The Relying Party does not want user verification to be used.

    • preferred - The Relying Party prefers that user verification is used if available but will not fail the ceremony if it is not provided.

    • required - The Relying Party requires user verification for the operation.

    Example Response JSON
    
    {
      "options": {
        "allowCredentials": [
          {
            "id": "HdN9wqP9mqOonacmiM2gIjASFYg",
            "transports": [
              "internal"
            ],
            "type": "public-key"
          }
        ],
        "challenge": "fdnW2u1_Nk9_FY2SprU4mPs0NgBTbo9tOO5Q9EvO1Oc",
        "rpId": "piedpiper.com",
        "timeout": 180000,
        "userVerification": "required"
      }
    }

    Complete a WebAuthn Passkey Authentication

    This API is used to complete a WebAuthn authentication ceremony by providing the values returned from the WebAuthn JavaScript API call. The API will validate the request against configured passkey requirements for the workflow and the one-time challenge generated and returned by Start a WebAuthn Passkey Assertion or Authentication.

    Request

    Complete a WebAuthn Authentication Ceremony

    URI

    POST /api/webauthn/login

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Cookies

    fusionauth.trust [String] Optional

    The Multi-Factor Trust identifier returned by the Multi-Factor Login API response. This value may be provided to bypass the Multi-Factor challenge when a User has Multi-Factor enabled. When this cookie exists on the request it will take precedence over the twoFactorTrustId if provided in the request body.

    Request Body

    The credential in the request body contains data returned by the WebAuthn JavaScript API call. The credential.response.authenticatorData, credential.response.clientDataJSON, credential.response.signature, and credential.response.userHandle fields must be converted to base64url-encoded strings for the FusionAuth API request. See WebAuthn JavaScript API Binary Format for details.

    credential.clientExtensionResults [Object] Optional

    The results for WebAuthn extensions requested during authentication. FusionAuth does not currently support any WebAuthn authentication extensions.

    credential.id [String] Required

    A base64url-encoded version of the credential Id used by the authenticator for this ceremony.

    credential.rpId [String] Optional

    If the tenant configuration overrides the Relying Party Id, this parameter should match tenant.webAuthnConfiguration.relyingPartyId, otherwise the value should be omitted from the request object.

    credential.response.authenticatorData [String] Required

    The base64url-encoded authenticator data from the WebAuthn JavaScript API response, which includes information on the passkey used to complete the ceremony and other data important for validation. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.clientDataJSON [String] Required

    The base64url-encoded client data from the WebAuthn JavaScript API response. This contains important information for the WebAuthn authentication validation process, including the one-time challenge generated when the registration ceremony began. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.signature [String] Required

    The base64url-encoded signature from the WebAuthn JavaScript API response. The authenticator generates the signature using the selected passkey’s private key by signing over the binary concatenation of credential.response.authenticatorData and the SHA-256 hash of credential.response.clientDataJSON before they are converted to base64url-encoded strings. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.userHandle [String] Optional

    The base64url-encoded user handle from the WebAuthn JavaScript API response. This field is only required when the user was not identified prior to the authentication ceremony through the use of a client-side discoverable passkey. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.type [String] Required

    The credential type of the passkey. The only value supported by WebAuthn is public-key.

    origin [String] Required

    The browser request origin during the authentication ceremony. For example, example.com.

    rpId [String] Required

    If the tenant configuration overrides the Relying Party Id, this parameter should match tenant.webAuthnConfiguration.relyingPartyId, otherwise the value should be the browser request origin’s effective domain during the ceremony.

    twoFactorTrustId [String] Optional

    The Multi-Factor Trust identifier returned by the Multi-Factor Login API response. This value may be provided to bypass the Multi-Factor challenge when a User has Multi-Factor enabled.

    Example Request JSON
    
    {
      "credential": {
        "id": "HdN9wqP9mqOonacmiM2gIjASFYg",
        "response": {
          "authenticatorData": "mPsv4VW-wth0V9gzsxWRFn-1SyC9gM4-QC4ptMFDNhUFAAAAKQ==",
          "clientDataJSON": "eyJjaGFsbGVuZ2UiOiJTeTYzQldla285blFsYzVOQmVWcE1BWjFtQ0hvdzBXUXVFeDRJU2xuQzR3IiwiY3Jvc3NPcmlnaW4iOmZhbHNlLCJvcmlnaW4iOiJodHRwczovL2Z1c2lvbmF1dGguaW8iLCJ0eXBlIjoid2ViYXV0aG4uZ2V0In0=",
          "signature": "MEUCIQDUwlDp9aNcYQmvpVGLJ35H8lRWjWsfjVsfPf_5HhY3GwIgahBhISBxv82ZS4ll8TZiJp5bIN2CGx_-VjUymfzKqGA=",
          "userHandle": "NzAzZmUyZDItMmQzOS00Y2I3LWI3NmQtMGI5OTE4ZWQyNDU3"
        },
        "type": "public-key"
      },
      "origin": "https://auth.piedpiper.com",
      "rpId": "piedpiper.com"
    }

    Response

    The response for this API contains the User object.

    Table 11. Response Codes
    Code Description

    200

    The authentication was successful. The response will contain the User object that was authenticated.

    202

    The user was authenticated successfully. The user is not registered for the application specified by the applicationId on the request. The response will contain the User object that was authenticated.

    203

    The user was authenticated successfully. The user is required to change their password, the response will contain the changePasswordId to be used on the Change Password API. Since version 1.15.0, the response will also contain a changePasswordReason field which can have one of the following values:

    • Administrative - An administrator has required this user to change their password.

    • Breached - The password has been found to have belonged to a breached dataset and must be changed, per the Reactor configuration.

    • Expired - The password has expired, per the expiration setting in the tenant configuration.

    • Validation - The password fails the validation rules configured in the tenant password settings.

    Example Response JSON
    
      {
      "changePasswordId": "XOgai4Ro68xfGiex0ngXiJ2bbhduM4Pm7h3lvF0xibQ",
      "changePasswordReason": "Expired"
    }

    212

    The user’s email address has not yet been verified. The response will contain the User object that was authenticated. If the emailConfiguration.verificationStrategy has been set to FormField, the response will contain the emailVerificationId that was generated for the user.

    213

    The user’s registration has not yet been verified. The response will contain the User object that was authenticated. If the emailConfiguration.verificationStrategy has been set to FormField, the response will contain the registrationVerificationId that was generated for the user.

    Prior to version 1.27.0, this status code was not returned, and you will see a 200 instead.

    242

    The user was authenticated successfully. The user has two factor authentication enabled. Since version 1.42.0, this status code is also returned when two factor authentication is required. The response will contain the twoFactorId to be used on the Complete Two Factor Authentication API.

    Example Response JSON
    
      {
      "methods": [
        {
          "authenticator": {
            "algorithm": "HmacSHA1",
            "codeLength": 6,
            "timeStep": 30
          },
          "id": "2KSZ",
          "method": "authenticator"
        },
        {
          "email": "richard@fusionauth.io",
          "id": "KLRT",
          "method": "email"
        }
      ],
      "twoFactorId": "YkQY5Gsyo4RlfmDciBGRmvfj3RmatUqrbjoIZ19fmw4"
    }

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors.

    404

    The user was not found or the password was incorrect. The response will be empty.

    409

    The user is currently in an action that has prevented login. The response will contain the actions that prevented login.

    Example Response JSON
    
      {
      "actions": [
        {
          "actionId": "00000000-0000-0000-0000-000000000042",
          "actionerUserId": "00000000-0000-0001-0000-000000000000",
          "expiry": 1571786483322,
          "localizedName": "Prevent Login Action",
          "localizedReason": "Hard Lock",
          "name": "Prevent Login Action",
          "reason": "Hard Lock",
          "reasonCode": "hard_lock"
        }
      ]
    }

    410

    The user has expired. The response will be empty.

    423

    The user is locked and cannot login. The response will be empty.

    Prior to version 1.9.0 a 404 status code will be returned instead.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Response Body

    refreshToken [String]

    The refresh token that can be used to obtain a new access token once the provided one has expired.

    Because a refresh token is per user and per application, this value will only be returned when an applicationId was provided on the login request and the user is registered to the application.

    You must explicitly allow generation of refresh tokens when using the Login API. Configure the application.loginConfiguration.generateRefreshTokens setting via the API or enable the setting by navigating to the Application → My Application → Security tab.

    refreshTokenId [String] Available since 1.37.0

    When the refreshToken is returned in the response, this field will also be returned. This unique Id is the persistent identifier for this refresh token, and will not change even when using one-time use refresh tokens. This value may optionally be used to revoke the token using the Refresh Token API.

    state [Object]

    If authenticated using a One Time Password and state was provided during the Change Password request this value will be returned exactly as it was provided.

    token [String] Available since 1.16.0

    The access token, this string is an encoded JSON Web Token (JWT).

    tokenExpirationInstant [Long] Available since 1.33.0

    The instant the token will expire. If the response does not contain a token, this field will also be omitted from the response.

    user.active [Boolean]

    True if the User is active. False if the User has been deactivated. Deactivated Users will not be able to login.

    user.birthDate [String]

    The User’s birthdate formatted as YYYY-MM-DD

    user.breachedPasswordLastCheckedInstant [Long]

    The instant this user’s password was last checked to determine if it is compromised.

    user.connectorId [UUID] Available since 1.18.0

    The unique Id of the Connector associated with the System of Record being used to authenticate the user.

    user.cleanSpeakId [UUID]

    This Id is used by FusionAuth when the User’s username is sent to CleanSpeak to be moderated (filtered and potentially sent to the approval queue). It is the content Id of the username inside CleanSpeak.

    user.data [Object]

    An object that can hold any information about the User that should be persisted.

    user.data.email [String]

    This field will be used as the email address if no user.email field is found.

    This feature was removed in version 1.26.0 and added back in in 1.27.2.

    user.email [String]

    The User’s email address.

    user.expiry [Long]

    The expiration instant of the User’s account. An expired user is not permitted to login.

    user.firstName [String]

    The first name of the User.

    user.fullName [String]

    The User’s full name as a separate field that is not calculated from firstName and lastName.

    user.id [UUID]

    The User’s unique Id.

    user.imageUrl [String]

    The URL that points to an image file that is the User’s profile image.

    user.insertInstant [Long]

    The instant when the user was created.

    user.lastLoginInstant [Long]

    The instant when the User logged in last.

    user.lastName [String]

    The User’s last name.

    user.lastUpdateInstant [Long]

    The instant when the User was last updated.

    user.memberships [Array]

    The list of memberships for the User.

    user.memberships[x].data [Object]

    An object that can hold any information about the User for this membership that should be persisted.

    user.memberships[x].groupId [UUID]

    The Id of the Group of this membership.

    user.memberships[x].id [UUID]

    The unique Id of this membership.

    user.memberships[x].insertInstant [Long]

    The instant that the membership was created.

    user.middleName [String]

    The User’s middle name.

    user.mobilePhone [String]

    The User’s mobile phone number. This is useful if you will be sending push notifications or SMS messages to the User.

    user.parentEmail [String] Available since 1.7.0

    The email address of the user’s parent or guardian. If this value was provided during a create or update operation, this value will only remain until the child is claimed by a parent.

    user.passwordChangeRequired [Boolean]

    Indicates that the User’s password needs to be changed during their next login attempt.

    user.passwordLastUpdateInstant [Long]

    The instant that the User last changed their password.

    user.preferredLanguages [Array<String>]

    An array of locale strings that give, in order, the User’s preferred languages. These are important for email templates and other localizable text. See Locales.

    user.registrations [Array]

    The list of registrations for the User. This will include registrations for inactive applications.

    user.registrations[x].applicationId [UUID]

    The Id of the Application that this registration is for.

    user.registrations[x].authenticationToken [String]

    The Authentication Token for this registration (if one exists).

    user.registrations[x].cleanSpeakId [UUID]

    This Id is used by FusionAuth when the User’s username for this registration is sent to CleanSpeak to be moderated (filtered and potentially sent to the approval queue). It is the content Id of the username inside CleanSpeak.

    user.registrations[x].data [Object]

    An object that can hold any information about the User for this registration that should be persisted.

    user.registrations[x].id [UUID]

    The Id of this registration.

    user.registrations[x].insertInstant [Long]

    The instant that this registration was created.

    user.registrations[x].lastLoginInstant [Long]

    The instant that the User last logged into the Application for this registration.

    user.registrations[x].preferredLanguages [Array<String>]

    An array of locale strings that give, in order, the User’s preferred languages for this registration. These are important for email templates and other localizable text.

    user.registrations[x].roles [Array<String>]

    The list of roles that the User has for this registration.

    user.registrations[x].timezone [String]

    The User’s preferred timezone for this registration. The string will be in an IANA time zone format.

    user.registrations[x].tokens [Map<String,String>] Deprecated

    A map that contains tokens returned from identity providers.

    For example, if this user has authenticated using the Facebook Identity Provider, the Facebook access token will be available in this map, keyed by name Facebook. For an OpenID Connect Identity provider, or other generic providers, if a token is stored it will be keyed by the Identity Provider unique Id.

    Removed in 1.28.0

    The token returned and stored from the Identity Provider is now stored in the IdP link and is retrievable using the Identity Provider Link API.

    user.registrations[x].username [String]

    The username of the User for this registration only. This is for display purposes and cannot be used to login.

    user.registrations[x].usernameStatus [String]

    The current status of the username. This is used if you are moderating usernames via CleanSpeak. The possible values are:

    • ACTIVE - the username is active

    • PENDING - the username is pending approval/moderation

    • REJECTED - the username was rejected during moderation

    If a username has been rejected, it is still possible to allow the User to update it and have the new one moderated again.

    user.registrations[x].verified [Boolean]

    This value indicates if this User’s registration has been verified.

    For additional information, see these tutorials:

    • Email Verification

    • Registration Verification

    user.tenantId [UUID]

    The Id of the Tenant that this User belongs to.

    user.timezone [String]

    The User’s preferred timezone. This can be used as a default to display instants, and it is recommended that you allow Users to change this per-session. The string will be in an IANA time zone format.

    user.twoFactor.methods[x].authenticator.algorithm [String]

    The algorithm used by the TOTP authenticator. With the current implementation, this will always be HmacSHA1.

    user.twoFactor.methods[x].authenticator.codeLength [Integer]

    The length of code generated by the TOTP. With the current implementation, this will always be 6.

    user.twoFactor.methods[x].authenticator.timeStep [Integer]

    The time-step size in seconds. With the current implementation, this will always be 30.

    user.twoFactor.methods[x].email [String]

    The value of the email address for this method. Only present if user.twoFactor.methods[x].method is email.

    user.twoFactor.methods[x].id [String]

    The unique Id of the method.

    user.twoFactor.methods[x].lastUsed [Boolean]

    true if this method was used most recently.

    user.twoFactor.methods[x].method [String]

    The type of this method. There will also be an object with the same value containing additional information about this method. The possible values are:

    • authenticator

    • email

    • sms

    user.twoFactor.methods[x].mobilePhone [String]

    The value of the mobile phone for this method. Only present if user.twoFactor.methods[x].method is sms.

    user.twoFactor.methods[x].secret [String]

    A base64 encoded secret

    user.twoFactorDelivery [String] Deprecated

    The User’s preferred delivery for verification codes during a two factor login request.

    The possible values are:

    • None

    • TextMessage

      Removed in version 1.26.0

    user.twoFactorEnabled [Boolean] Deprecated

    Determines if the User has two factor authentication enabled for their account or not.

    Removed in version 1.26.0

    user.username [String]

    The username of the User.

    user.usernameStatus [String]

    The current status of the username. This is used if you are moderating usernames via CleanSpeak. The possible values are:

    • ACTIVE - the username is active

    • PENDING - the username is pending approval/moderation

    • REJECTED - the username was rejected during moderation

    If a username has been rejected, it is still possible to allow the User to update it and have the new one moderated again.

    user.verified [Boolean]

    Whether or not the User’s email has been verified.

    For additional information, see these tutorials:

    • Email Verification

    • Registration Verification

    Example Response JSON
    
    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0ODUxNDA5ODQsImlhdCI6MTQ4NTEzNzM4NCwiaXNzIjoiYWNtZS5jb20iLCJzdWIiOiIyOWFjMGMxOC0wYjRhLTQyY2YtODJmYy0wM2Q1NzAzMThhMWQiLCJhcHBsaWNhdGlvbklkIjoiNzkxMDM3MzQtOTdhYi00ZDFhLWFmMzctZTAwNmQwNWQyOTUyIiwicm9sZXMiOltdfQ.Mp0Pcwsz5VECK11Kf2ZZNF_SMKu5CgBeLN9ZOP04kZo",
      "user": {
        "active": true,
        "birthDate": "1976-05-30",
        "connectorId": "e3306678-a53a-4964-9040-1c96f36dda72",
        "data": {
          "displayName": "Johnny Boy",
          "favoriteColors": [
            "Red",
            "Blue"
          ]
        },
        "email": "example@fusionauth.io",
        "expiry": 1571786483322,
        "firstName": "John",
        "fullName": "John Doe",
        "id": "00000000-0000-0001-0000-000000000000",
        "imageUrl": "http://65.media.tumblr.com/tumblr_l7dbl0MHbU1qz50x3o1_500.png",
        "lastLoginInstant": 1471786483322,
        "lastName": "Doe",
        "middleName": "William",
        "mobilePhone": "303-555-1234",
        "passwordChangeRequired": false,
        "passwordLastUpdateInstant": 1471786483322,
        "preferredLanguages": [
          "en",
          "fr"
        ],
        "registrations": [
          {
            "applicationId": "10000000-0000-0002-0000-000000000001",
            "data": {
              "displayName": "Johnny",
              "favoriteSports": [
                "Football",
                "Basketball"
              ]
            },
            "id": "00000000-0000-0002-0000-000000000000",
            "insertInstant": 1446064706250,
            "lastLoginInstant": 1456064601291,
            "preferredLanguages": [
              "en",
              "fr"
            ],
            "roles": [
              "user",
              "community_helper"
            ],
            "username": "johnny123",
            "usernameStatus": "ACTIVE"
          }
        ],
        "timezone": "America/Denver",
        "tenantId": "f24aca2b-ce4a-4dad-951a-c9d690e71415",
        "twoFactorEnabled": false,
        "usernameStatus": "ACTIVE",
        "username": "johnny123",
        "verified": true
      }
    }

    Complete a WebAuthn Passkey Assertion

    This API is used to validate a WebAuthn authentication ceremony by providing the values returned from the WebAuthn JavaScript API call, but it does not authenticate the user. This API can be used to confirm that a user has access to a particular passkey without authenticating them.

    Request

    Assert a WebAuthn Authentication Ceremony

    URI

    POST /api/webauthn/assert

    Request Headers

    X-FusionAuth-TenantId [String] Optional

    The unique Id of the tenant used to scope this API request.

    The tenant Id is not required on this request even when more than one tenant has been configured because the tenant can be identified based upon the request parameters or it is otherwise not required.

    Specify a tenant Id on this request when you want to ensure the request is scoped to a specific tenant. The tenant Id may be provided through this header or by using a tenant locked API key to achieve the same result.

    See Making an API request using a Tenant Id for additional information.

    Request Body

    The credential in the request body contains data returned by the WebAuthn JavaScript API call. The credential.response.authenticatorData, credential.response.clientDataJSON, credential.response.signature, and credential.response.userHandle fields must be converted to base64url-encoded strings for the FusionAuth API request. See WebAuthn JavaScript API Binary Format for details.

    credential.clientExtensionResults [Object] Optional

    The results for WebAuthn extensions requested during authentication. FusionAuth does not currently support any WebAuthn authentication extensions.

    credential.id [String] Required

    A base64url-encoded version of the credential Id used by the authenticator for this ceremony.

    credential.rpId [String] Optional

    If the tenant configuration overrides the Relying Party Id, this parameter should match tenant.webAuthnConfiguration.relyingPartyId, otherwise the value should be omitted from the request object.

    credential.response.authenticatorData [String] Required

    The base64url-encoded authenticator data from the WebAuthn JavaScript API response, which includes information on the passkey used to complete the ceremony and other data important for validation. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.clientDataJSON [String] Required

    The base64url-encoded client data from the WebAuthn JavaScript API response. This contains important information for the WebAuthn authentication validation process, including the one-time challenge generated when the registration ceremony began. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.signature [String] Required

    The base64url-encoded signature from the WebAuthn JavaScript API response. The authenticator generates the signature using the selected passkey’s private key by signing over the binary concatenation of credential.response.authenticatorData and the SHA-256 hash of credential.response.clientDataJSON before they are converted to base64url-encoded strings. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.response.userHandle [String] Optional

    The base64url-encoded user handle from the WebAuthn JavaScript API response. This field is only required when the user was not identified prior to the authentication ceremony through the use of a client-side discoverable passkey. See Converting ArrayBuffer to base64url-encoded String for details on converting this value for the FusionAuth API request.

    credential.type [String] Required

    The credential type of the passkey. The only value supported by WebAuthn is public-key.

    origin [String] Required

    The browser request origin during the authentication ceremony. For example, example.com.

    rpId [String] Required

    If the tenant configuration overrides the Relying Party Id, this parameter should match tenant.webAuthnConfiguration.relyingPartyId, otherwise the value should be the browser request origin’s effective domain during the ceremony.

    twoFactorTrustId [String] Optional

    The Multi-Factor Trust identifier returned by the Multi-Factor Login API response. This value may be provided to bypass the Multi-Factor challenge when a User has Multi-Factor enabled.

    Example Request JSON
    
    {
      "credential": {
        "id": "HdN9wqP9mqOonacmiM2gIjASFYg",
        "response": {
          "authenticatorData": "mPsv4VW-wth0V9gzsxWRFn-1SyC9gM4-QC4ptMFDNhUFAAAAKQ==",
          "clientDataJSON": "eyJjaGFsbGVuZ2UiOiJTeTYzQldla285blFsYzVOQmVWcE1BWjFtQ0hvdzBXUXVFeDRJU2xuQzR3IiwiY3Jvc3NPcmlnaW4iOmZhbHNlLCJvcmlnaW4iOiJodHRwczovL2Z1c2lvbmF1dGguaW8iLCJ0eXBlIjoid2ViYXV0aG4uZ2V0In0=",
          "signature": "MEUCIQDUwlDp9aNcYQmvpVGLJ35H8lRWjWsfjVsfPf_5HhY3GwIgahBhISBxv82ZS4ll8TZiJp5bIN2CGx_-VjUymfzKqGA=",
          "userHandle": "NzAzZmUyZDItMmQzOS00Y2I3LWI3NmQtMGI5OTE4ZWQyNDU3"
        },
        "type": "public-key"
      },
      "origin": "https://auth.piedpiper.com",
      "rpId": "piedpiper.com"
    }

    Response

    The response for this API contains the WebAuthn passkey used to complete the assertion.

    Table 12. Response Codes
    Code Description

    200

    The request was successful. The response will contain a JSON body.

    400

    The request was invalid and/or malformed. The response will contain an Errors JSON Object with the specific errors. This status will also be returned if a paid FusionAuth license is required and is not present.

    500

    There was an internal error. A stack trace is provided and logged in the FusionAuth log files. The response will be empty.

    503

    The search index is not available or encountered an exception so the request cannot be completed. The response will contain a JSON body.

    Response Body

    credential.algorithm [Long]

    The identifier for the signing algorithm used with the passkey. These values are defined by the IANA COSE Algorithms registry. FusionAuth supports a subset of these algorithms.

    Table 13. Supported algorithms
    Name Value Description

    RS256

    -257

    RSASSA-PKCS1-v1_5 using SHA-256

    RS384

    -258

    RSASSA-PKCS1-v1_5 using SHA-384

    RS512

    -259

    RSASSA-PKCS1-v1_5 using SHA-512

    PS256

    -37

    RSASSA-PSS w/ SHA-256

    PS384

    -38

    RSASSA-PSS w/ SHA-384

    PS512

    -39

    RSASSA-PSS w/ SHA-512

    ES256

    -7

    ECDSA w/ SHA-256

    ES384

    -35

    ECDSA w/ SHA-384

    ES512

    -36

    ECDSA w/ SHA-512

    credential.attestationType [String]

    The type of attestation provided when the passkey was registered. Passkeys registered in FusionAuth will have a value of none. Imported passkeys may have another value.

    credential.authenticatorSupportsUserVerification [Boolean]

    Indicates whether this authenticator supports user verification. User verification ensures that the user is authorized to use the authenticator.

    This value is currently determined by whether user verification occurred during the registration of this passkey rather than by other means, such as examining FIDO authenticator metadata.

    credential.credentialId [String]

    The credential Id generated by the authenticator is stored as a base64url-encoded string. This value is used by authenticators to look up a passkey during an authentication ceremony and to prevent multiple passkeys from being registered on the same authenticator for a single user.

    credential.data [Object]

    An object that can hold any information about the passkey that should be persisted.

    credential.discoverable [Boolean]

    Indicates whether the passkey is "client-side discoverable." Discoverable passkeys can be used in authentication ceremonies without first identifying the user (e.g. by requiring the user to complete a form field).

    credential.displayName [String]

    The display name for the passkey selected during registration. This value should have been selected by the user.

    credential.id [UUID]

    The unique identifier for this passkey.

    credential.insertInstant [Long]

    The instant that the passkey was added to the FusionAuth database.

    credential.lastUseInstant [Long]

    The instant that the passkey was last used to complete a WebAuthn ceremony.

    credential.name [String]

    A unique name meant to disambiguate passkeys with the same credential.displayName.

    credential.publicKey [String]

    The passkey’s public key, encoded in PEM format.

    credential.relyingPartyId [String]

    The Relying Party Id used at the time the passkey was registered.

    credential.signCount [Integer]

    A signature counter for the passkey. The signature count can be used by a Relying Party to identify a cloned or malfunctioning authenticator.

    credential.tenantId [UUID]

    The Id of the tenant to which this passkey belongs.

    credential.transports [List<String>]

    A list of transport types supported by the authenticator that generated the passkey. This value is used as a hint to help identify eligible authenticators during a WebAuthn ceremony.

    FusionAuth treats the list of transports as strings to maximize authenticator compatibility. These values are used as hints during WebAuthn ceremonies and missing, extra, or unexpected values should not cause a ceremony to fail. Some common values are:

    • internal - the authenticator is integrated with the client device

    • usb - the authenticator can be contacted over USB

    • nfc - the authenticator can be contacted over Near Field Communication (NFC)

    • ble - the authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy, or BLE)

    • cable - "cloud-assisted" BLE. This transport is used for Android devices acting as an authenticator connected to the computer over Bluetooth

    • hybrid - replacement for the cable transport

    credential.userAgent [String]

    The user agent at the time the passkey was registered. This can be useful for troubleshooting purposes.

    credential.userId [UUID]

    The Id of the user that this passkey belongs to.

    Example Response JSON
    
    {
      "credential": {
        "algorithm": -7,
        "attestationType": "none",
        "authenticatorSupportsUserVerification": true,
        "credentialId": "HdN9wqP9mqOonacmiM2gIjASFYg",
        "data": {},
        "displayName": "Chrome Touch ID",
        "name": "richard@fusionauth.io",
        "id": "c664318a-2384-4c35-9475-9a200e1d3b72",
        "insertInstant": 1668011701792,
        "discoverable": false,
        "lastUseInstant": 1668021630599,
        "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz9DI9AQfZn1aDJG5sw3Ckl7SoQ7E\nLPElDoJMijphvVigTcNMTc8H9Xptl8B20QHMOXGTzaUxLGNY1c8yhw9VVA==\n-----END PUBLIC KEY-----",
        "relyingPartyId": "piedpiper.com",
        "signCount": 41,
        "tenantId": "30663132-6464-6665-3032-326466613934",
        "transports": [
          "internal"
        ],
        "userId": "703fe2d2-2d39-4cb7-b76d-0b9918ed2457"
      }
    }

    Feedback

    How helpful was this page?

    See a problem?

    File an issue in our docs repo

    Have a question or comment to share?

    Visit the FusionAuth community forum.

    © 2023 FusionAuth
    How-to
    Subscribe for developer updates