Skip to main content
ネイティブパスキーは、現在、限定早期アクセスでご利用いただけます。Auth0のリリースについては、「製品のリリース段階」を参照してください。
パスキーは、従来の認証形式(ユーザー名/パスワードなど)に代わるフィッシング耐性のある代替手段であり、より簡単かつ安全なユーザーエクスペリエンスを提供します。パスキーは、FIDO® W3C Web Authentication(WebAuthn)とClient to Authenticator Protocol(CTAP)の仕様)をモデルにしています。 Auth0は現在、データベース接続の認証方法としてパスキーに対応し、実装には以下の2つの方法を提供しています。 モバイルアプリケーションにパスキーを実装する詳細については、以下の情報を参照してください。

仕組み

ネイティブのパスキーは、Auth0 Authentication APIとネイティブiOSまたはAndroid APIの組み合わせを使用して、チャレンジフローをモバイルアプリケーションに直接埋め込みます。そうすることで、アプリケーションのサインアップとログインで統合されたエクスペリエンスを作り出すことができます。認証を完了するのに、ブラウザーでユーザーをリダイレクトする必要はありません。 以下の例は、パスキーのサインアップフローでユーザーが体験するかもしれないプロセスを説明したものです。
  1. 新しいユーザーがモバイルアプリケーションを起動して、ログイン画面にアクセスします。新しいユーザーであるため、[サインアップ]ボタンを選択します。
  2. ユーザーが次の画面でメールアドレスを入力し、[アカウントの作成]を選択します。
  3. 次に、アプリケーションのパスキーを作成したいかがユーザーに尋ねられます。ユーザーが[続ける]を選択して続行します。
  4. パスキーを生成するために、ユーザーは生体認証や他の認証方法(PINの入力など)を使って、デバイスをローカルで認証しなければなりません。
  5. ローカルの認証が完了すると、新しいパスキーがユーザーのデバイスに保存され、iCloudやGoogleなどのパスキープロバイダーと同期されます。
  6. パスキーが保存されると、ユーザーが新規登録プロセスを続行して、アカウントを完了させます。
このプロセスが完了すると、ユーザーはアプリケーションへの次回のログインで保存済みのパスキーを使って認証することができます。

開始する前に

カスタムドメインを構成する

ネイティブのパスキーにはカスタムドメインの使用が必要です。始める前に、テナントにカスタムドメインが構成されていることを確認してください。詳細については、「カスタムドメイン」をお読みください。

パスキーポリシーを構成する

AndroidまたはiOSのアプリケーションにネイティブのパスキーを実装するには、まずAuth0テナントでパスキーポリシーを構成しなければなりません。テナントを準備するには、「パスキーポリシーを構成する」に記載の手順に従います。

アプリケーションを準備する

ネイティブのパスキーにアプリケーションを準備するには、[Device Settings(デバイスの設定)]を構成し、Passkey付与を追加する必要があります。構成には、またはを使用することができます。

Auth0 Dashboard

  1. [Applications(アプリケーション)]>[Application(アプリケーション)]に移動して、更新したいアプリケーションを選択します。
  2. [Settings(設定)]タブの下までスクロールして、[Advanced Settings(高度な設定)] を選択します。次に、[Device Settings(デバイスの設定)] タブを選択します。
  3. アプリケーションに必要な iOS または Android のセクションを完了させます。そして、[Save Changes(変更の保存)] をクリックします。
  4. [Advanced Settings(詳細設定)]セクションで [Grant Types(付与タイプ)] タブを選択します。
  5. [Passkey(パスキー)] の付与を有効にしてから、[Save Changes(変更の保存)] を選択します。

Mangement API

クライアント更新エンドポイントを呼び出して、以下を行います。
  • grant_typesを更新して、urn:okta:params:oauth:grant-type:webauthnを含めるようにします。
  • mobileオブジェクトを使用し、必要に応じてiOSとAndroidのデバイス設定を指定します。

パスキーフローを実装する

アプリケーションには以下のパスキーフローを定義することができます。
  • サインアップフロー:新しいユーザーがユーザー登録プロセスでパスキーを生成して保存できるようにします。
  • ログインフロー:パスキーに登録済みの既存のユーザーが、ログインプロセスで保存済みのパスキーを使って認証できるようにします。

サインアップフロー

アプリケーションに初めてログインしようとしたときに、ユーザーがパスキーのサインアップフローを始めます。 ユーザーが既存の識別子を提供した場合には、代わりに、ログインフローの完了をユーザーに求めることをお勧めします。そうしないと、アクションが失敗します。

フローの手順

  1. ユーザーがアプリケーションを開いて、新しいアカウントの登録を選択します。アプリケーションが要求するメールアドレスなどの識別子をユーザーが入力します。
  2. アプリケーションがAuth0 Authentication APIのサインアップチャレンジ要求エンドポイントを呼び出して、サインアップチャレンジを始めます。
    • realmを指定しない場合には、テナントにデフォルトのディレクトリが使用されます。
    • デフォルトでは、メールが必須の識別子です。データベース接続でFlexible Identifierを有効にした場合は、emailphone_numberusernameの組み合わせを識別子として使用することができます。これらのオプションは必須または任意にできますが、Flexible Identifierの構成に一致する必要があります。
    POST /passkey/register
    Content-Type: application/json
    
    {
      "client_id": "<CLIENT_ID>",
      "realm": "<OPTIONAL_CONNECTION>",
      "user_profile": {
    	  "email": "<VALID_EMAIL_ADDRESS>",
    	  "name": "<OPTIONAL_USER_DISPLAY_NAME>",
      }
    }
    
  3. 応答で、Auth0はPublicKeyCredentialCreationOptionsauth_session IDと一緒に返します。
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "authn_params_public_key": {
        "challenge": "<GENERATED_CHALLENGE_FOR_THIS_SESSION>",
        "timeout": <MILLISECONDS>,
        "rp": {
          "id": "<THE_CUSTOM_DOMAIN>",
          "name": "<THE_CUSTOM_DOMAIN>"
        },
        "pubKeyCredParams": [
          { type: 'public-key', alg: -8 },
          { type: 'public-key', alg: -7 },
          { type: 'public-key', alg: -257 }
        ],
        "authenticatorSelection": {
          "residentKey": "required",
          "userVerification": "preferred"
        },
        "user": {
          "id": "<GENERATED_ID>",
          "name": "<USER-ENTERED_IDENTIFIER>",
          "displayName": "<USER-ENTERED_DISPLAY_NAME_OR_IDENTIFIER_IF_MISSING>"
        }
      },
      "auth_session": "<SESSION_ID>"
    }
    
  4. アプリケーションが適切なネイティブAPIを使用して、ユーザー登録プロセスを完了します。
  5. アプリケーションがauthn_responseの詳細などを含む、登録プロセスで取得した資格情報を使用して、トークンエンドポイントを呼び出します。
    POST /oauth/token
    Content-Type: application/json
    
    {
      "grant_type": "urn:okta:params:oauth:grant-type:webauthn",
      "client_id": "<CLIENT_ID>",
      "realm": "<OPTIONAL_CONNECTION>",
      "scope": "<OPTIONAL_REQUESTED_SCOPE>",
      "audience": "<OPTIONAL_REQUESTED_AUDIENCE>"
      "auth_session": "<SESSION_ID_FROM_THE_FIRST_REQUEST>",
      "authn_response": {
        "id": "<BASE64URL_ID>",
        "rawId": "<BASE64URL_RAWID>",
        "type": "public-key",
        "authenticatorAttachment": "platform|cross-platform",
        "response": {
          "clientDataJSON": "<BASE64URL_CLIENT_DATA_JSON>",
          "attestationObject": "<BASE64URL_ATTESTATION_OBJECT>",
          <OTHER_PROPERTIES>
        }  
    }
    
  6. Auth0が新しいユーザーアカウントを作成して、要求されたトークンを返し、フローが完了します。
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "access_token": "<BASE64_TOKEN>",
      "refresh_token": "<BASE64_TOKEN>",
      "id_token": "<BASE64_TOKEN>",
      "token_type": "Bearer",
      "expires_in": <SECONDS>
    }
    

ログインフロー

既存のユーザーがアプリケーションにログインしようとしたときに、パスキーのログインフローを始めます。このフローは、既存のユーザーが最初のサインアップでアカウントにパスキーを保存している場合にのみ有効です。

フローの手順

  1. ユーザーがアプリケーションを起動して、ログイン画面を開きます。アプリケーションがAuthentication APIのログインチャレンジ要求エンドポイントを呼び出して、ログインチャレンジを始めます。
    realmを指定しない場合には、テナントにデフォルトのディレクトリが使用されます。
    POST /passkey/challenge
    Content-Type: application/json
    
    {
      "client_id": "<CLIENT_ID>",
      "realm": "<OPTIONAL_CONNECTION>"
    }
    
  2. 応答で、Auth0はPublicKeyCredentialRequestOptionsauth_sessionと一緒に返し、アプリケーションでフローを続行します。
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "authn_params_public_key": {
        "challenge": "<GENERATED_CHALLENGE_FOR_THIS_SESSION>",
        "timeout": <AUTH_TIMEOUT_IN_MILLISECONDS>,
        "rpId": "<CUSTOM_DOMAIN>",
        "userVerification": "preferred"
      },
      "auth_session": "<SESSION_ID>"
    }
    
  3. アプリケーションが適切なネイティブAPIを使用して、ログインプロセスを完了します。
  4. アプリケーションがauthn_responseの詳細などを含む、ログインプロセスで取得した資格情報を使用して、トークンエンドポイントを呼び出します。
    POST /oauth/token
    Content-Type: application/json
    
    {
      "grant_type": "urn:okta:params:oauth:grant-type:webauthn",
      "client_id": "<CLIENT_ID>",
      "realm": "<OPTIONAL_CONNECTION>",
      "scope": "<OPTIONAL_REQUESTED_SCOPE>",
      "audience": "<OPTIONAL_REQUESTED_AUDIENCE>"
      "auth_session": "<SESSION_ID_FROM_THE_FIRST_REQUEST>",
      "authn_response": {
        "id": "<BASE64URL_ID>",
        "rawId": "<BASE64URL_RAWID>",
        "type": "public-key",
        "authenticatorAttachment": "platform|cross-platform",
        "response": {
          "authenticatorData": "<BASE64URL_AUTHENTICATORDATA>",
          "clientDataJSON": "<BASE64URL_CLIENTDATAJSON>",
          "signature": "<BASE64URL_SIGNATURE>",
          "userHandle": "<BASE64URL_USERHANDLE>"
        },
        "clientExtensionResults": <OPTIONAL_OBJECT>
    }
    
  5. Auth0が資格情報を認証して、要求されたトークンを返し、フローが完了します。
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "access_token": "<BASE64_TOKEN>",
      "refresh_token": "<BASE64_TOKEN>",
      "id_token": "<BASE64_TOKEN>",
      "token_type": "Bearer",
      "expires_in": <SECONDS>
    }
    

リファレンス

モバイルアプリケーションにネイティブパスキーを実装する際には、以下のリソースを参考にすることができます。