アカウント リンクは、モバイルアプリ内で直接行えるので、ユーザーはサービスに登録したアカウントと Google アカウントをリンクできます。所定のリンクを設定すると、ユーザーが共有に同意したデータに Google がアクセスできるようになります。
ユーザーにとってのメリットは次のとおりです。
- ユーザーは、お客様が使い慣れている環境でアカウントのリンク プロセスを開始して完了できます。
- ユーザーはデバイスとモバイルアプリですでに認証されているため、ログイン認証情報は必要ありません。
デベロッパーにとってのメリットは次のとおりです。
- モバイルアプリでアカウント プロモーションをどこで宣伝し始めるか(ユーザー設定、インタースティシャル、ユーザーがモバイルアプリにログインした後など)を管理します。アカウントのリンクを開始するために複数のエントリ ポイントを追加すると、アカウントのリンクを見つけやすくなりますできるため、エンゲージメントが増加し、リンクされたアカウントの数が増えました。
- ユーザーがウェブベースのウェブベースの OAuth フローよりも少ない手順でリンク処理を完了できるようになったため、コンバージョン率が上昇しました。
- このフローでは既存の OAuth2.0 実装が実装されているため、既存の OAuth2.0 実装が活用されるため、プラットフォーム(Android)からのリンクの実装に必要なエンジニアリング作業が少なくて済みます。
- ユーザーがログイン認証情報を再入力する必要がなく、プロセスをより少ないステップで完了できるため、離脱率の低減。 ユーザーがログイン認証情報を取り消して入力する必要がある場合、離脱率が 80% に達することがあります。
仕組み
プラットフォームからのリンクは、次の手順で完了します。
- ユーザーがモバイルアプリでリンク トリガーをクリックまたは切り替えます。
- ユーザーがリンクする Google アカウントを選択します。
- ユーザーがデバイス上の既存の Google アカウントを選択してリンクするか、新しいアカウントでログインします。
- ユーザーには Google がホストする同意画面が表示され、続行するには同意する必要があります。キャンセルするとリンク プロセスが停止します。
- ユーザーに同意画面が表示され、続行するには同意する必要があります。キャンセルすると、リンク プロセスが停止します。
- リンクは、ユーザーのアカウント(サービス上)と Google アカウントの間に確立されます。

図 1. プラットフォーム フローからリンクする
要件
プラットフォームからリンクを実装するには、次のものが必要です。
- Android アプリ。
- OAuth 2.0 の認可コードフローをサポートする OAuth 2.0 サーバーを所有、管理、メンテナンスする。
セットアップ
以下の手順に進む前に、アカウントのリンクの登録プロセスを完了する必要があります。
開発環境の設定
開発ホストに最新の Google Play 開発者サービスを入手します。
- Android SDK Manager を開きます。
[SDK Tools] で [Google Play 開発者サービス] を見つけます。
これらのパッケージのステータスが [インストール済み] でない場合は、両方を選択して [パッケージをインストール] をクリックします。
アプリを構成する
プロジェクト レベルの
build.gradle
ファイルで、buildscript
セクションとallprojects
セクションの両方に Google の Maven リポジトリを含めます。buildscript { repositories { google() } } allprojects { repositories { google() } }
「Google とリンク」API の依存関係をモジュールのアプリレベルの Gradle ファイル(通常は
app/build.gradle
)に追加します。dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
プラットフォームからリンクのサポートを追加する
プラットフォームのフローからリンクすると、サービスから提供されたアクセス トークンが Google に保存されます。ユーザーのトークンを返す前に、同意を得る必要があります。
以下の手順に沿ってユーザーの同意を得て、Google Play 開発者サービス SDK を介して認証コード トークンを返します。
同意アクティビティを起動できる 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();
同意インテントを処理する対応するアクティビティを作成する
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()
メソッドが呼び出されると想定しています。トークンを保存するためのリクエストを作成し、他の構成パラメータとともに、上記の手順 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)を案内します。