> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-docs-event-stream-action-templates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# モバイルアプリケーション向けのネイティブパスキー

> AndroidやiOSのアプリケーションにネイティブパスキーフローを実装する方法について説明します。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  ネイティブパスキーは、現在、限定早期アクセスでご利用いただけます。Auth0のリリースについては、「[製品のリリース段階](/docs/ja-jp/troubleshoot/product-lifecycle/product-release-stages)」を参照してください。
</Callout>

パスキーは、従来の認証形式（ユーザー名/パスワードなど）に代わるフィッシング耐性のある代替手段であり、より簡単かつ安全なユーザーエクスペリエンスを提供します。パスキーは、FIDO® W3C Web Authentication（WebAuthn）とClient to Authenticator Protocol（CTAP）の[仕様](https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html#intro))をモデルにしています。

Auth0は現在、データベース接続の認証方法としてパスキーに対応し、実装には以下の2つの方法を提供しています。

* Webベースのアプリケーション用の[ユニバーサルログインのパスキー](/docs/ja-jp/authenticate/database-connections/passkeys)
* AndroidおよびiOSアプリケーション用のネイティブパスキー

モバイルアプリケーションにパスキーを実装する詳細については、以下の情報を参照してください。

## 仕組み

ネイティブのパスキーは、[Auth0 Authentication API](/docs/ja-jp/native-passkeys-api)とネイティブiOSまたはAndroid APIの組み合わせを使用して、チャレンジフローをモバイルアプリケーションに直接埋め込みます。そうすることで、アプリケーションのサインアップとログインで統合されたエクスペリエンスを作り出すことができます。認証を完了するのに、ブラウザーでユーザーをリダイレクトする必要はありません。

以下の例は、パスキーのサインアップフローでユーザーが体験するかもしれないプロセスを説明したものです。

1. 新しいユーザーがモバイルアプリケーションを起動して、ログイン画面にアクセスします。新しいユーザーであるため、［サインアップ］ボタンを選択します。
2. ユーザーが次の画面でメールアドレスを入力し、［アカウントの作成］を選択します。
3. 次に、アプリケーションのパスキーを作成したいかがユーザーに尋ねられます。ユーザーが［続ける］を選択して続行します。
4. パスキーを生成するために、ユーザーは生体認証や他の認証方法（PINの入力など）を使って、デバイスをローカルで認証しなければなりません。
5. ローカルの認証が完了すると、新しいパスキーがユーザーのデバイスに保存され、iCloudやGoogleなどのパスキープロバイダーと同期されます。
6. パスキーが保存されると、ユーザーが新規登録プロセスを続行して、アカウントを完了させます。

このプロセスが完了すると、ユーザーはアプリケーションへの次回のログインで保存済みのパスキーを使って認証することができます。

## 開始する前に

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

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

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

AndroidまたはiOSのアプリケーションにネイティブのパスキーを実装するには、まずAuth0テナントでパスキーポリシーを構成しなければなりません。テナントを準備するには、「[パスキーポリシーを構成する](/docs/ja-jp/authenticate/database-connections/passkeys/configure-passkey-policy)」に記載の手順に従います。

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

ネイティブのパスキーにアプリケーションを準備するには、［Device Settings（デバイスの設定）］を構成し、`Passkey`付与を追加する必要があります。構成には、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=auth0-dashboard" tip="Auth0 Dashboard: サービスを構成するためのAuth0の主製品。" cta="用語集の表示">Auth0 Dashboard</Tooltip>または<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">Management API</Tooltip>を使用することができます。

#### Auth0 Dashboard

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

#### Mangement API

[クライアント更新](/docs/ja-jp/api/management/v2/clients/patch-clients-by-id)エンドポイントを呼び出して、以下を行います。

* `grant_types`を更新して、`urn:okta:params:oauth:grant-type:webauthn`を含めるようにします。
* `mobile`オブジェクトを使用し、必要に応じてiOSとAndroidのデバイス設定を指定します。

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

アプリケーションには以下のパスキーフローを定義することができます。

* [サインアップフロー](#signup-flow)：新しいユーザーがユーザー登録プロセスでパスキーを生成して保存できるようにします。
* [ログインフロー](#login-flow)：パスキーに登録済みの既存のユーザーが、ログインプロセスで保存済みのパスキーを使って認証できるようにします。

### サインアップフロー

アプリケーションに初めてログインしようとしたときに、ユーザーがパスキーのサインアップフローを始めます。

ユーザーが既存の識別子を提供した場合には、代わりに、ログインフローの完了をユーザーに求めることをお勧めします。そうしないと、アクションが失敗します。

#### フローの手順

1. ユーザーがアプリケーションを開いて、新しいアカウントの登録を選択します。アプリケーションが要求するメールアドレスなどの識別子をユーザーが入力します。

2. アプリケーションがAuth0 Authentication APIの[サインアップチャレンジ要求](/docs/ja-jp/native-passkeys-api#request-signup-challenge)エンドポイントを呼び出して、サインアップチャレンジを始めます。

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     * `realm`を指定しない場合には、テナントにデフォルトのディレクトリが使用されます。
     * デフォルトでは、メールが必須の識別子です。データベース接続で[Flexible Identifier](/docs/ja-jp/authenticate/database-connections/activate-and-configure-attributes-for-flexible-identifiers)を有効にした場合は、`email`、`phone_number`と`username`の組み合わせを識別子として使用することができます。これらのオプションは必須または任意にできますが、Flexible Identifierの構成に一致する必要があります。
   </Callout>

   ```http lines theme={null}
   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は[PublicKeyCredentialCreationOptions](https://www.w3.org/TR/webauthn-3/#dictdef-publickeycredentialcreationoptions)を`auth_session` IDと一緒に返します。

   ```lines theme={null}
   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を使用して、ユーザー登録プロセスを完了します。

   * 「[Androidでの登録に関するドキュメント](https://developer.android.com/identity/sign-in/credential-manager#create-passkey)」をご覧ください。
   * 「[iOSでの登録に関するドキュメント](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Register-a-new-account-on-a-service)」をご覧ください。

5. アプリケーションが`authn_response`の詳細などを含む、登録プロセスで取得した資格情報を使用して、[トークン](/docs/ja-jp/native-passkeys-api#authenticate-new-user)エンドポイントを呼び出します。

   ```lines theme={null}
   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が新しいユーザーアカウントを作成して、要求されたトークンを返し、フローが完了します。

   ```lines theme={null}
   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の[ログインチャレンジ要求](/docs/ja-jp/native-passkeys-api#request-login-challenge)エンドポイントを呼び出して、ログインチャレンジを始めます。

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     `realm`を指定しない場合には、テナントにデフォルトのディレクトリが使用されます。
   </Callout>

   ```lines theme={null}
   POST /passkey/challenge
   Content-Type: application/json

   {
     "client_id": "<CLIENT_ID>",
     "realm": "<OPTIONAL_CONNECTION>"
   }
   ```

2. 応答で、Auth0は[PublicKeyCredentialRequestOptions](https://www.w3.org/TR/webauthn-3/#dictdef-publickeycredentialrequestoptions)を`auth_session`と一緒に返し、アプリケーションでフローを続行します。

   ```lines theme={null}
   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を使用して、ログインプロセスを完了します。

   * 「[Androidでのログインに関するドキュメント](https://developer.android.com/identity/sign-in/credential-manager#sign-in)」をご覧ください。
   * 「[iOSでのログインに関するドキュメント](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Connect-to-a-service-with-an-existing-account)」をご覧ください。

4. アプリケーションが`authn_response`の詳細などを含む、ログインプロセスで取得した資格情報を使用して、[トークン](/docs/ja-jp/native-passkeys-api#authenticate-existing-user)エンドポイントを呼び出します。

   ```lines theme={null}
   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が資格情報を認証して、要求されたトークンを返し、フローが完了します。

   ```lines theme={null}
   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>
   }
   ```

## リファレンス

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

* Auth0 Authentication API

  * [サインアップチャレンジを要求する](/docs/ja-jp/native-passkeys-api#request-signup-challenge)
  * [新規ユーザーを認証する](/docs/ja-jp/native-passkeys-api#authenticate-new-user)
  * [ログインチャレンジを要求する](/docs/ja-jp/native-passkeys-api#request-login-challenge)
  * [既存のユーザーを認証する](/docs/ja-jp/native-passkeys-api#authenticate-existing-user)
* Androidのリソース

  * [登録に関するドキュメント](https://developer.android.com/identity/sign-in/credential-manager#create-passkey)
  * [ログインに関するドキュメント](https://developer.android.com/identity/sign-in/credential-manager#sign-in)
* iOSのリソース

  * [登録に関するドキュメント](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Register-a-new-account-on-a-service)
  * [ログインに関するドキュメント](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Connect-to-a-service-with-an-existing-account)
