> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ネイティブ モバイル アプリケーションに Google でログイン を実装する方法を説明します。

# ネイティブ Android アプリに Google でログインを追加する

[Google でログイン](https://developers.google.com/identity/gsi/web/guides/overview) を使用すると、ユーザーは有効な Google アカウントで認証でき、アプリケーションでシームレスなログイン体験を提供できます。Auth0 と Android の Credential Manager を使用して、この機能をネイティブ Android アプリケーションに実装できます。

以下のセクションでは、Google でログインを設定するために必要な手順と方法について詳しく説明します。

<div id="how-it-works">
  ## 仕組み
</div>

この機能では、Android の Credential Manager を使用して、Auth0 で保護された Android アプリケーションで Google でログインを実現します。以下の手順は、Google でログインにおける一般的なユーザーフローを示しています。

<Frame>
  <img src="https://mintcdn.com/translations/6GE5Z24GDCZehiJ9/docs/images/cdy7uua7fh8z/6WofMhOOH7GU0NwEcyebiZ/4d4adcb20b74215c7026c1bc9c95be6c/Google_Sign_In_diagram.png?fit=max&auto=format&n=6GE5Z24GDCZehiJ9&q=85&s=d3062e551fc414cd920b510a1b33c530" alt="" width="3884" height="2351" data-path="docs/images/cdy7uua7fh8z/6WofMhOOH7GU0NwEcyebiZ/4d4adcb20b74215c7026c1bc9c95be6c/Google_Sign_In_diagram.png" />
</Frame>

1. ユーザーが Android アプリケーションを開き、Google でのログインを選択します。
2. Android アプリケーションは Credential Manager を使用して、Google でログインをリクエストします。
3. アカウント選択プロンプトで、ユーザーは使用する Google アカウントを選択します。
4. Google がユーザーをローカルでサインインさせ、認証をすべて処理します。
5. ユーザーは追加の操作なしでサインインを完了します。
6. Google は `id_token` を Android アプリケーションに返します。
7. Android アプリケーションは、検証のために `id_token` を Auth0 テナントに送信します。Auth0 は、`id_token` の `client_id` を、テナントで設定された Google ソーシャル接続の `client_id` と照合して検証します。
8. Auth0 サーバーは `access_token` を Android アプリケーションに返します。

<div id="before-you-begin">
  ## 始める前に
</div>

Google でログイン の設定を開始する前に、次の条件を満たしていることを確認してください。

* Auth0 テナント内で [Google ソーシャル接続](https://marketplace.auth0.com/integrations/google-social-connection) が設定されていること。
  * **Purpose** 設定では、Authentication、Connected Accounts for Token Vault、またはその両方で接続を有効にします。詳細については、[User authentication vs Connected Accounts](/ja/docs/secure/tokens/token-vault/connected-accounts-for-token-vault#user-authentication-vs-connected-accounts) を参照してください。
* [Android's Credential Manager](https://developer.android.com/identity/sign-in/credential-manager-siwg) を使用して、Android アプリケーションに Google でログイン が追加されていること。

<div id="configuring-sign-in-with-google-for-android-applications">
  ## Android アプリケーション向けの Google でログイン の設定
</div>

Google でログイン を実装するには、主に次の 3 つの手順があります。

1. Google Cloud Console で認証情報を作成する。
2. Auth0 でアプリケーションの詳細を設定する。
3. Android アプリケーションのコードを更新する。

以下のセクションでは、各手順の技術的な詳細を説明します。

<div id="create-credentials-in-the-google-cloud-console">
  ### Google Cloud Console で認証情報を作成する
</div>

開始するには、まず Google Cloud Console で次の項目を設定する必要があります。

1. タイプを `Android` に設定した OAuth 2.0 認証情報を作成します。これを `client_id_native` と呼びます。
2. 手順 1 で作成した Android クライアントに、ネイティブアプリケーションの SHA1 ハッシュを追加します。

   * 現時点で、Google がサポートしているのは SHA1 のみです。
3. Web 用の追加の OAuth クライアント (`client_id_web`) を作成します。

   * シナリオによっては、Web ベースの Google でログイン をサポートするソーシャル接続用に、この項目がすでに設定されている場合があります。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Google Credential Manager では Android の `client_id` を使用できません。使用するとエラーが発生します。Google から返される IDトークン では、authorized party (azp) は自動的に Android OAuth クライアントIDに設定され、オーディエンス (aud) は Web OAuth クライアントIDに設定されます。

  Android から Credentials Manager を呼び出す場合、ネイティブアプリケーションでは Credentials Manager SDK の `.setServerClientId` を使用して `client_id_web` を指定する必要があります。`client_id_web` は Google Cloud Console の Web Application OAuth 2 Credential に対応しており、Google OAuth2 ソーシャル接続で設定されます。詳細については、[Google のドキュメント](https://developer.android.com/training/sign-in/credential-manager)を参照してください。
</Callout>

<div id="configure-auth0">
  ### Auth0 を設定する
</div>

Google でのログイン フローでは、Auth0 と Android アプリケーションの間で行われる <Tooltip tip="OAuth 2.0: 認可プロトコルとワークフローを定義する認可フレームワーク。" cta="用語集を表示" href="/ja/docs/glossary?term=OAuth+2.0">OAuth 2.0</Tooltip> トークン交換を使用します。

Google Cloud Console で認証情報を作成したら、Android の Credential Manager を使用して Google でのログインを有効にできます。そのためには、<Tooltip tip="Auth0 Dashboard: サービスを設定するための Auth0 の主要プロダクト。" cta="用語集を表示" href="/ja/docs/glossary?term=Auth0+Dashboard">Auth0 Dashboard</Tooltip> または <Tooltip tip="Management API: 管理タスクを実行できるようにするプロダクト。" cta="用語集を表示" href="/ja/docs/glossary?term=Management+API">Management API</Tooltip> のいずれかでアプリケーションを更新します。

<Tabs>
  <Tab title="Auth0 Dashboard">
    Auth0 Dashboard でアプリケーションを更新するには、次の手順に従います。

    1. [Applications > Applications](https://manage.auth0.com/#/applications) に移動し、ネイティブ Android アプリケーションを選択します。
    2. **Settings** タブで、**Advanced Settings** セクションを展開します。
    3. **Device Settings** タブを選択し、**Enable Sign in with Google (Android 4.4+) using Credentials Manager** を有効にします。
    4. **新しいアプリケーションの場合**: **Device Settings** タブで、**App Package Name** を含む **Android** セクションの各フィールドに入力します。詳細については、[Enable Android App Links Support](/ja/docs/get-started/applications/enable-android-app-links-support) を参照してください。
    5. **Save Changes** を選択します。
  </Tab>

  <Tab title="Management API">
    Management API でアプリケーションを更新するには、次のように [Update a client](https://auth0.com/docs/api/management/v2/clients/patch-clients-by-id) エンドポイントを呼び出します。

    ```json lines theme={null}
    PATCH /api/v2/clients/{id}

    { 
      "native_social_login": { 
        "google": { 
          "enabled": true 
        } 
      },
      "mobile": {
        "android": {
          // アプリのバンドル識別子に合わせて更新してください
          "app_package_name": "com.yoursite.yourapp"
        }
      }
    }
    ```
  </Tab>
</Tabs>

<div id="update-code-in-the-android-application">
  ### Android アプリケーションのコードを更新する
</div>

次の例は、Microsoft、ユーザー名とパスワード、またはエンタープライズ フェデレーションなど、Google 以外の認証に使用する Web フローを補完するものです。

```go lines theme={null}
auth0Client.loginWithNativeSocialToken(
  googleCredential.idToken.toString(),
  "http://auth0.com/oauth/token-type/google-id-token")
    .validateClaims()
    .setScope("openid profile email")
    .start(object: Callback < Credentials, AuthenticationException > {
      override fun onFailure(error: AuthenticationException) {
        showSnackBar("Failure a0: $error")

      }

   override fun onSuccess(auth0Creds: Credentials) {
    // 認証情報を処理するロジック
    }
    })
```

Google の `googleCredential` を取得するには、ネイティブアプリケーション コードから Google ライブラリを呼び出す必要があります。詳細については、[Google の Credential Manager ドキュメント](https://developer.android.com/training/sign-in/credential-manager) を参照してください。

```go lines expandable theme={null}
// トークンリプレイ攻撃対策のためnonceを生成する
val randomNonce = UUID.randomUUID().toString()

// サインインリクエストを準備する
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    // Auth0 Dashboardで設定したクライアントIDと一致する必要がある
    .setServerClientId(
        getString(R.string.com_google_client_id)
    )
	.setNonce(randomNonce)
    .build()

val request: GetCredentialRequest = GetCredentialRequest.Builder()
    .addCredentialOption(googleIdOption)
    .build()

// プロンプトを表示する
val credMan = CredentialManager.create(this@MainActivity.baseContext);
val result = credMan.getCredential(
    request = request,
    context = this@MainActivity.baseContext,
)

// 結果を処理する 
val creds = result.credential

when (creds) {
    is CustomCredential -> {
        if (creds.type ==
                    GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
            ) {
                try {
                    val googleCredentials = GoogleIdTokenCredential
                            .createFrom(creds.data)
// 以降のコード
```

<div id="additional-authentication-scenarios">
  ## 追加の認証シナリオ
</div>

現在の Google の実装では、エンタープライズ フェデレーションや追加の <Tooltip tip="多要素認証（MFA）: SMS で送信されるコードなど、ユーザー名とパスワードに加えて認証要素を使用するユーザー認証プロセス。" cta="用語集を表示" href="/ja/docs/glossary?term=multi-factor+authentication">多要素認証</Tooltip> (MFA) チャレンジに関する明確なガイダンスはありませんが、Web エクスペリエンスに移行することで、これらの機能に対応できます。

<div id="enterprise-federation">
  ### エンタープライズ フェデレーション
</div>

Auth0 はエンタープライズ フェデレーションをサポートしており、外部の[エンタープライズ IDプロバイダー](/ja/docs/authenticate/identity-providers/enterprise-identity-providers) (Okta Workforce、ADFS、その他の OIDC 互換システムなど) を Auth0 テナントに接続できます。これにより、ユーザーは既存の企業認証情報を使用して認証できるようになります。

エンタープライズ フェデレーションを使用する必要がある場合は、前の例で示したように `id_token` に依存するのではなく、ユーザーを Web ベースのフローにリダイレクトすることを推奨します。

これを行うには、Google の <Tooltip tip="JSON Web Token（JWT）: 2 者間でクレームを安全に表現するために使用される標準的な IDトークン形式（および多くの場合はアクセストークン形式）。" cta="用語集を表示" href="/ja/docs/glossary?term=JWT">JWT</Tooltip> トークンをデコードし、<Tooltip tip="JSON Web Token（JWT）: 2 者間でクレームを安全に表現するために使用される標準的な IDトークン形式（および多くの場合はアクセストークン形式）。" cta="用語集を表示" href="/ja/docs/glossary?term=ID+token">IDトークン</Tooltip> に含まれる `email` を `login_hint` として渡します。これにより、エンドユーザーは Web フローでメールアドレスを再入力する必要がなくなります。

```go lines theme={null}
if (error.isAccessDenied && reason == "Enterprise Domain") {
WebAuthProvider.login(account)
	.withParameters(mapOf("login_hint" to email))
	.start(...)
}
```

<div id="mfa-considerations-during-token-exchange">
  ### トークン交換時の MFA に関する考慮事項
</div>

Google OAuth 接続のポリシーで多要素認証が必須になっている場合、Auth0 はトークン交換時にアプリケーションにエラーを返します。このエラーは、アプリケーションへのレスポンスに含まれます。

上記のエラーが発生した場合、アプリケーションは Google の `id_token` で利用可能な拡張コンテキストを使用して WebAuth を利用できます。このシナリオでは、エンドユーザーに表示されるのは MFA 画面のみです。

```go lines theme={null}
if (error.isMultifactorRequired) {
WebAuthProvider.login(account)
	.withParameters(mapOf(
"login_hint" to email,
"connection" to "google-oauth-2"
))
	.start(...)
}
```
