メインコンテンツへスキップ
Google でログイン を使用すると、ユーザーは有効な Google アカウントで認証でき、アプリケーションでシームレスなログイン体験を提供できます。Auth0 と Android の Credential Manager を使用して、この機能をネイティブ Android アプリケーションに実装できます。 以下のセクションでは、Google でログインを設定するために必要な手順と方法について詳しく説明します。

仕組み

この機能では、Android の Credential Manager を使用して、Auth0 で保護された Android アプリケーションで Google でログインを実現します。以下の手順は、Google でログインにおける一般的なユーザーフローを示しています。
  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_tokenclient_id を、テナントで設定された Google ソーシャル接続の client_id と照合して検証します。
  8. Auth0 サーバーは access_token を Android アプリケーションに返します。

始める前に

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

Android アプリケーション向けの Google でログイン の設定

Google でログイン を実装するには、主に次の 3 つの手順があります。
  1. Google Cloud Console で認証情報を作成する。
  2. Auth0 でアプリケーションの詳細を設定する。
  3. Android アプリケーションのコードを更新する。
以下のセクションでは、各手順の技術的な詳細を説明します。

Google Cloud Console で認証情報を作成する

開始するには、まず 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 でログイン をサポートするソーシャル接続用に、この項目がすでに設定されている場合があります。
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 のドキュメントを参照してください。

Auth0 を設定する

Google でのログイン フローでは、Auth0 と Android アプリケーションの間で行われる トークン交換を使用します。 Google Cloud Console で認証情報を作成したら、Android の Credential Manager を使用して Google でのログインを有効にできます。そのためには、 または のいずれかでアプリケーションを更新します。
Auth0 Dashboard でアプリケーションを更新するには、次の手順に従います。
  1. Applications > 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 を参照してください。
  5. Save Changes を選択します。

Android アプリケーションのコードを更新する

次の例は、Microsoft、ユーザー名とパスワード、またはエンタープライズ フェデレーションなど、Google 以外の認証に使用する Web フローを補完するものです。
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 ドキュメント を参照してください。
// トークンリプレイ攻撃対策のため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)
// 以降のコード

追加の認証シナリオ

現在の Google の実装では、エンタープライズ フェデレーションや追加の (MFA) チャレンジに関する明確なガイダンスはありませんが、Web エクスペリエンスに移行することで、これらの機能に対応できます。

エンタープライズ フェデレーション

Auth0 はエンタープライズ フェデレーションをサポートしており、外部のエンタープライズ IDプロバイダー (Okta Workforce、ADFS、その他の OIDC 互換システムなど) を Auth0 テナントに接続できます。これにより、ユーザーは既存の企業認証情報を使用して認証できるようになります。 エンタープライズ フェデレーションを使用する必要がある場合は、前の例で示したように id_token に依存するのではなく、ユーザーを Web ベースのフローにリダイレクトすることを推奨します。 これを行うには、Google の トークンをデコードし、 に含まれる emaillogin_hint として渡します。これにより、エンドユーザーは Web フローでメールアドレスを再入力する必要がなくなります。
if (error.isAccessDenied && reason == "Enterprise Domain") {
WebAuthProvider.login(account)
	.withParameters(mapOf("login_hint" to email))
	.start(...)
}

トークン交換時の MFA に関する考慮事項

Google OAuth 接続のポリシーで多要素認証が必須になっている場合、Auth0 はトークン交換時にアプリケーションにエラーを返します。このエラーは、アプリケーションへのレスポンスに含まれます。 上記のエラーが発生した場合、アプリケーションは Google の id_token で利用可能な拡張コンテキストを使用して WebAuth を利用できます。このシナリオでは、エンドユーザーに表示されるのは MFA 画面のみです。
if (error.isMultifactorRequired) {
WebAuthProvider.login(account)
	.withParameters(mapOf(
"login_hint" to email,
"connection" to "google-oauth-2"
))
	.start(...)
}