プラットフォームから直接 Google アカウントのリンクを開始する。

アカウント リンクは、モバイルアプリ内で直接行えるので、ユーザーはサービスに登録したアカウントと Google アカウントをリンクできます。所定のリンクを設定すると、ユーザーが共有に同意したデータに Google がアクセスできるようになります。

このアプローチでは、アシスタントの会話ではなく、アプリの使い慣れたコンテキスト内でユーザーをエンゲージメントすることで、アカウント リンクのパフォーマンスを向上させます。ユーザー オンボーディング、設定、その他のアプリ サーフェスに統合して、Google アシスタント アクションの検出とエンゲージメントの機会を創出できます。たとえば、リンク後にユーザーをアクションに直接移動させることを提案できます。

ユーザーにとってのメリットは次のとおりです。

  • ユーザーは、お客様が使い慣れている環境でアカウントのリンク プロセスを開始して完了できます。
  • ユーザーはデバイスとモバイルアプリですでに認証されているため、ログイン認証情報は必要ありません。

デベロッパーにとってのメリットは次のとおりです。

  • モバイルアプリでアカウント プロモーションをどこで宣伝し始めるか(ユーザー設定、インタースティシャル、ユーザーがモバイルアプリにログインした後など)を管理します。アカウントのリンクを開始するために複数のエントリ ポイントを追加すると、アカウントのリンクを見つけやすくなりますできるため、エンゲージメントが増加し、リンクされたアカウントの数が増えました。
  • ユーザーがウェブベースのウェブベースの OAuth フローよりも少ない手順でリンク処理を完了できるようになったため、コンバージョン率が上昇しました。
  • このフローでは既存の OAuth2.0 実装が実装されているため、既存の OAuth2.0 実装が活用されるため、プラットフォーム(Android)からのリンクの実装に必要なエンジニアリング作業が少なくて済みます。
  • ユーザーがログイン認証情報を再入力する必要がなく、プロセスをより少ないステップで完了できるため、離脱率の低減。 ユーザーがログイン認証情報を取り消して入力する必要がある場合、離脱率が 80% に達することがあります。

仕組み

プラットフォームからのリンクは、次の手順で完了します。

  1. ユーザーがモバイルアプリでリンク トリガーをクリックまたは切り替えます。
  2. ユーザーがリンクする Google アカウントを選択します。
    1. ユーザーがデバイス上の既存の Google アカウントを選択してリンクするか、新しいアカウントでログインします。
  3. Google ホスト型の同意画面が表示され、ユーザーは同意して続行するか、キャンセルしてアカウントへの関連付けを停止する必要があります。
  4. 同意画面が表示され、ユーザーは同意して続行するか、キャンセルしてアカウントへの関連付けを停止する必要があります。
  5. ユーザーのサービス アカウントと Google アカウントの間にリンクが確立されます。

図 1. プラットフォームからのリンクフロー

要件

プラットフォームからのリンクを実装するには、次のものが必要です。

  • Android アプリ。
  • OAuth 2.0 認可コードフローをサポートする OAuth 2.0 サーバーを所有、管理、維持していること。

設定

以下の手順に進む前に、アカウント リンクの登録プロセスを完了しておく必要があります。

開発環境の設定

開発ホストで最新の Google Play 開発者サービスを入手します。

  1. Android SDK Manager を開きます。
  1. [SDK Tools] で [Google Play 開発者サービス] を見つけます。

  2. これらのパッケージのステータスが [Installed] でない場合は、両方を選択して [Install Packages] をクリックします。

アプリを設定する

  1. プロジェクト レベルの build.gradle ファイルにおいて、buildscript セクションと allprojects セクションの両方に Google の Maven リポジトリを組み込みます。

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. モジュールのアプリレベルの Gradle ファイル(通常は app/build.gradle)に、「Google でリンク」API の依存関係を追加します。

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.5.1'
    }
    

プラットフォームからのリンクフローでは、サービスから提供されたアクセス トークンが Google によって保存されます。ユーザーにトークンを返す前に、同意を得る必要があります。

以下の手順に沿って、ユーザーから同意を得て、Google Play 開発者サービス SDK 経由で認証コードトークンを返します。

  1. 同意アクティビティを起動できる PendingIntent を作成します。同意は Play 開発者サービス API によって起動されます。API が呼び出されたら、PendingIntent(明確にするために記すと consentPendingIntent と呼びます)を指定する必要があります。

    Kotlin

    // Build a PendingIntent that can launch the consent activity
    val consentPendingIntent = buildConsentPendingIntent()
    

    Java

    // Build a PendingIntent that can launch your consent activity
    PendingIntent consentPendingIntent =
              buildConsentPendingIntent();
    
  2. 同意インテントを処理する対応するアクティビティを作成します。

    Kotlin

      class ConsentActivity : AppCompatActivity
    
      private fun onConsentAccepted() {
          // Obtain a token (for simplicity, we’ll ignore the async nature
          // of the following call)
          val token = getToken()
          val intent = Intent()
                      .putExtra(SaveAccountLinkingTokenRequest.EXTRA_TOKEN,
                                token)
          setResult(Activity.RESULT_OK, intent)
          finish()
      }
    
      private fun onConsentRejectedOrCanceled() {
          setResult(Activity.RESULT_CANCELED)
          finish()
      }
    

    Java

      public class ConsentActivity extends AppCompatActivity {
        ...
        private void onConsentAccepted() {
          // Obtain a token (for simplicity, we’ll ignore the async nature of
          // the following call
          String token = getToken();
          Intent intent = new Intent();
          intent.putExtra(SaveAccountLinkingTokenRequest.EXTRA_TOKEN, token);
          setResult(Activity.RESULT_OK, intent);
          finish();
        }
    
        private void onConsentRejectedOrCanceled() {
          setResult(Activity.RESULT_CANCELED, null);
          finish();
        }
     }
    
    

    ユーザーが同意した場合は onConsentAccpeted() メソッドが呼び出され、同意を拒否またはキャンセルした場合は onConsentRejectedOrCanceled() メソッドが呼び出されることを前提としています。

  3. トークンを保存するリクエストを作成し、他の構成パラメータとともに、上記の手順 1 で作成した PendingIntent を渡します。

    Kotlin

      // Create an ActivityResultLauncher which registers a callback for the
      // Activity result contract
      val activityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult())
        { result ->
          if (result.resultCode == RESULT_OK) {
            // Successfully finished the flow and saved the token
          } else {
            // Flow failed, for example the user may have canceled the flow
          }
        }
    
      // Build token save request
      val request = SaveAccountLinkingTokenRequest.builder()
        .setTokenType(SaveAccountLinkingTokenRequest.TOKEN_TYPE_AUTH_CODE)
        .setConsentPendingIntent(consentPendingIntent)
        .setServiceId("service-id-of-and-defined-by-developer")
        //Set the scopes that the token is valid for on your platform
        .setScopes(scopes)
        .build()
    
       // Launch consent activity and retrieve token
       Identity.getCredentialSavingClient(this)
         .saveAccountLinkingToken(request)
         .addOnSuccessListener( saveAccountLinkingTokenResult -> {
            if (saveAccountLinkingTokenResult.hasResolution()) {
              val pendingIntent = saveAccountLinkingTokenResult
                                  .getPendingIntent()
              val intentSenderRequest = IntentSenderRequest
                                        .Builder(pendingIntent).build()
              activityResultLauncher.launch(intentSenderRequest)
            } else {
               // This should not happen, let’s log this
               Log.e(TAG, "Failed to save token");
            }
          })
          .addOnFailureListener(e -> Log.e(TAG, Failed to save token, e))
    

    Java

      // Create an ActivityResultLauncher which registers a callback for the
      // Activity result contract
      ActivityResultLauncher<IntentSenderRequest>
          activityResultLauncher =
          registerForActivityResult(new ActivityResultContracts
                                        .StartIntentSenderForResult(),
                                    result -> {
          if (result.getResultCode() == RESULT_OK) {
              // Successfully finished the flow and saved the token
          } else {
              // Flow failed, for example the user may have canceled the flow
          }
      });
    
     // Build token save request
     SaveAccountLinkingTokenRequest request =
        SaveAccountLinkingTokenRequest.builder()
            .setTokenType(
                SaveAccountLinkingTokenRequest.TOKEN_TYPE_AUTH_CODE)
            .setConsentPendingIntent(consentPendingIntent)
            .setServiceId("service-id-of-and-defined-by-developer")
            //Set the scopes that the token is valid for on your platform
            .setScopes(scopes)
            .build();
    
      // Launch consent activity and retrieve token
      Identity.getCredentialSavingClient(this)
          .saveAccountLinkingToken(request)
          .addOnSuccessListener(
              saveAccountLinkingTokenResult -> {
                if (saveAccountLinkingTokenResult.hasResolution()) {
                  // Launch the resolution intent
                  PendingIntent pendingIntent =
                      saveAccountLinkingTokenResult.getPendingIntent();
                  IntentSenderRequest intentSenderRequest =
                      new IntentSenderRequest.Builder(pendingIntent).build();
                  activityResultLauncher.launch(intentSenderRequest);
                } else {
                  // This should not happen, let’s log this
                  Log.e(TAG, "Failed to save token");
                }
              })
          .addOnFailureListener(e -> Log.e(TAG, "Failed to save token", e));
      ```
    

上記の手順では、ユーザーに同意を求め、Google に認証コードを返します。

ベスト プラクティス

  • アプリでは、ボタン、切り替え、または同様の視覚要素を使用して、リンク ステータスをユーザーに示します。

    図 1. リンク ステータスのサンプル画像

  • リンクが成功したら、ユーザーに通知する必要があります。たとえば、トーストを表示したり、切り替え状態の変更をトリガーしたり、別のリンク成功ページにユーザーをリダイレクトしたりします。

  • アプリ内ユーザーにアカウントのリンクを求めることを検討してください。理想的には、リンクがユーザーにメリットをもたらすことを示す強力なシグナルに基づいてリンクを求めるようにします。

  • リンクが成功したら、リンクされたアカウントで何ができるかを示す例をユーザーに提示します。たとえば、音楽ストリーミング サービスをリンクした場合は、Google アシスタントに音楽を再生するようリクエストします。

  • ユーザーがリンクされたアカウントを管理できるようにします。リンクを解除するオプションも用意してください。Google のリンク済みアカウント管理ページ(https://myaccount.google.com/accountlinking)にユーザーを誘導します。

リファレンス

Android 認証 API リファレンス ドキュメント