Google アカウントによるログインをサポートしている場合は、ワンタップ ログイン クライアントを使用して、アプリのコンテキストから移動することなく、スムーズなアカウント作成をユーザーに提供できます。
ワンタップ UI を表示すると、ユーザーはデバイス上の Google アカウントのいずれかを使用して、アプリで新しいアカウントを作成するよう求められます。ユーザーが続行を選択すると、基本的なプロフィール情報(名前、プロフィール写真、確認済みメールアドレス)を含む ID トークンを受け取ります。この ID トークンを使用して、新しいアカウントを作成できます。
ワンタップ アカウントの作成は、
- このページで説明するように、ワンタップ クライアントをアプリに統合します。これはワンタップ ログインを使用する場合とほぼ同じですが、構成に違いがあります。
- Google ID トークンからユーザー アカウントを作成する機能をバックエンドに追加する。詳細については、バックエンドでの ID トークンの使用をご覧ください。
ワンタップの登録はどこで利用できますか?
ユーザーにワンタップの登録を提供する最も効果的な場所は、ログインによって新機能が有効になる状況です。まず、保存した認証情報でユーザーのログインを試行します。保存されている認証情報が見つからない場合は、ユーザーの新しいアカウントを作成することを提案します。
始める前に
ワンタップ ログインのスタートガイドの説明に沿って、Google API Console プロジェクトと Android プロジェクトを設定します。
1. ワンタップ クライアントを設定する
アカウント作成用にワンタップ クライアントを構成する手順は次のとおりです。
- パスワード認証情報のリクエストは有効にしないでください。(ワンタップ登録はトークンベースの認証でのみ可能です)。
setGoogleIdTokenRequestOptions()
と次の設定を使用して、Google ID トークン リクエストを有効にします。- サーバーのクライアント ID を Google API Console で作成した ID に設定します。これは、Android クライアント ID ではなく、サーバーのクライアント ID です。
- デバイス上のすべての Google アカウントを表示するようにクライアントを構成します。つまり、承認済みアカウントでフィルタしないようにします。
- 必要に応じて、アカウントの確認済みの電話番号をリクエストすることもできます。
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. ワンタップ UI のキャンセルを追跡する
プロンプトを閉じるか、プロンプトの外側をタップして、ユーザーがワンタップ登録の使用をすでに拒否しているかどうかを追跡する必要があります。これは、アクティビティのブール値プロパティと同じくらい簡単です。(下記のワンタップ UI の表示を停止するをご覧ください)。
3. ワンタップ登録の UI を表示する
ユーザーがワンタップでの新しいアカウントを作成することを拒否していない場合は、クライアント オブジェクトの beginSignIn()
メソッドを呼び出し、返される Task
にリスナーをアタッチします。アプリでこの手順は通常、ワンタップのログイン リクエストで保存された認証情報が見つからない場合(つまり、ログイン リクエストの失敗リスナー内に)行われます。
ユーザーがデバイスに 1 つ以上の Google アカウントをセットアップしている場合、ワンタップ クライアントは成功リスナーを呼び出します。成功リスナーで、Task
の結果からペンディング インテントを取得し、それを startIntentSenderForResult()
に渡してワンタップ UI を起動します。
ユーザーのデバイスに Google アカウントがない場合は、ワンタップ クライアントが失敗リスナーを呼び出します。この場合は、何もする必要はありません。そのままアプリのログアウト状態を維持でき、ユーザーは通常のアカウント作成フローで登録できます。
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. ユーザーの応答を処理する
ワンタップの登録プロンプトに対するユーザーの応答は、アクティビティの onActivityResult()
メソッドを使用してアプリに報告されます。ユーザーがアカウントの作成を選択した場合、結果は Google ID トークンになります。ユーザーがワンタップ UI を閉じるか、UI の外側をタップして登録を拒否した場合は、コード RESULT_CANCELED
が返されます。アプリは両方の可能性に対応する必要があります。
Google ID トークンを使用してアカウントを作成する
ユーザーが Google アカウントでの登録を選択した場合は、onActivityResult()
のインテント データをワンタップ クライアントの getSignInCredentialFromIntent()
メソッドに渡すことで、ユーザーの ID トークンを取得できます。認証情報には null 以外の googleIdToken
プロパティが含まれます。
ID トークンを使用してバックエンドでアカウントを作成し(ID トークンを使用してバックエンドで認証するを参照)、ユーザーをログインさせます。
認証情報には、アカウントの確認済みの電話番号(利用可能な場合)など、リクエストした追加情報も含まれます。
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
ワンタップ UI の表示を停止する
ユーザーがログインを拒否した場合、getSignInCredentialFromIntent()
の呼び出しにより、CommonStatusCodes.CANCELED
ステータス コードの ApiException
がスローされます。このような場合は、ワンタップ ログイン UI の表示を一時的に停止して、プロンプトが繰り返し表示されることをユーザーに不快感させないようにする必要があります。次の例では、Activity のプロパティを設定して、ユーザーにワンタップ ログインを提供するかどうかを決定しています。ただし、値を SharedPreferences
に保存するなど、他の方法を使用することも可能です。
ワンタップ ログイン プロンプトに独自のレート制限を実装することが重要です。追加せずに、ユーザーが複数のプロンプトを続けてキャンセルした場合、ワンタップ クライアントはその後 24 時間、ユーザーにプロンプトを表示しません。
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
次のステップ
ユーザーがワンタップの登録フローを完了すると、Google ID トークンを取得します。このトークンには、基本的なプロフィール情報(ユーザーのメールアドレス、氏名、プロフィール写真の URL など)が含まれています。多くのアプリでは、バックエンドでユーザーを認証して新しいアカウントを作成するには、この情報で十分です。
アカウントの作成を完了するために追加情報(ユーザーの生年月日など)が必要な場合は、登録の詳細フローをユーザーに提示して、この追加情報をリクエストします。その後、バックエンドに送信してアカウントの作成を完了します。