> ## 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.

> ネイティブ モバイル アプリケーションに Sign In with Google を実装する方法を学びましょう。

# ネイティブ Android アプリに Sign In with Google を追加する

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

以下のセクションでは、Sign in with Google の設定に必要な手順と方法について詳しく説明します。

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

この機能は Android の Credential Manager を使用して、Auth0 で保護された Android アプリケーションでの Sign In with Google を容易にします。以下の手順は、Sign In with 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 を使用して、Sign In with 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>

Sign In with Google の設定を開始する前に、次の条件を満たしていることを確認してください。

* Auth0 テナント内で [Google ソーシャル接続](https://marketplace.auth0.com/integrations/google-social-connection) が設定されていること。
  * **Purpose** 設定では、認証、Token Vault の接続済みアカウント、またはその両方に対して接続を有効にします。詳しくは、[ユーザー認証と接続済みアカウント](/docs/ja-jp/secure/tokens/token-vault/connected-accounts-for-token-vault#user-authentication-vs-connected-accounts) をご覧ください。
* [Android の Credential Manager](https://developer.android.com/identity/sign-in/credential-manager-siwg) を使用して、Android アプリケーションに Sign In with Google が追加されていること。

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

Sign In with 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 Client に、ネイティブ アプリケーションの SHA1 ハッシュを追加します。

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

   * 状況によっては、Web ベースの Sign in with Google をサポートする Social 接続用に、この項目がすでに設定済みの場合があります。

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

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

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

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

Google Cloud Console で資格情報を作成したら、Android 向け Credential Manager を使用して Sign in with Google を有効にできます。これを行うには、<Tooltip tip="Auth0 Dashboard: サービスを設定するためのAuth0の主要製品。" cta="用語集を表示" href="/docs/ja-jp/glossary?term=Auth0+Dashboard">Auth0 Dashboard</Tooltip>または<Tooltip tip="Management API: お客様が管理タスクを実行できるようにする製品。" cta="用語集を表示" href="/docs/ja-jp/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](/docs/ja-jp/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で設定したClient 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="/docs/ja-jp/glossary?term=multi-factor+authentication">多要素認証</Tooltip> (MFA) チャレンジに関する明確なガイダンスは提供されていませんが、Web エクスペリエンスに移行することで、これらの機能に対応できます。

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

Auth0 はエンタープライズ フェデレーションをサポートしており、外部の[エンタープライズ アイデンティティプロバイダー](/docs/ja-jp/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="/docs/ja-jp/glossary?term=JWT">JWT</Tooltip> をデコードし、<Tooltip tip="JSON Web Token（JWT）: 2 者間でクレームを安全に表現するために使用される標準的な ID トークン形式（また、多くの場合アクセストークン形式）です。" cta="用語集を見る" href="/docs/ja-jp/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(...)
}
```
