ワンタップで新しいアカウントを作成できます

Google アカウントによるログインに対応している場合は、ワンタップ ログイン スムーズなアカウント作成エクスペリエンスも 実現できます アプリのコンテキストから外れることはありません。

ワンタップの登録 UI

ワンタップ UI を表示すると、ユーザーは ユーザーのデバイス上のいずれかの Google アカウントを使用してアプリにログインできます。ユーザーが 続行するには、基本的なプロフィール情報を含む ID トークンを取得します。 名前、プロフィール写真、確認済みのメールアドレスが入力され、 新しいアカウントを作成します。

ワンタップでのアカウントの作成は、次の 2 つの部分に分かれています。

  • アプリへのワンタップ クライアントの統合については、このページで説明します。 これはワンタップ ログインを使用する場合とほぼ同じですが、いくつか異なる点があります できます。
  • Google ID からユーザー アカウントを作成する機能をバックエンドに追加する トークン。詳細については、バックエンドでの ID トークンの使用をご覧ください。

ワンタップ登録はどこで使用できますか?

ユーザーにワンタップ登録を提供するのに最も有効なのは、 ログインすると新機能が有効になります。まず、次のコマンドでユーザーのログインを試します。 認証情報が保存されます。保存されている認証情報が見つからない場合は、新しい認証情報の作成を提案する 作成する必要があります。

始める前に

説明に沿って、Google API Console プロジェクトと Android プロジェクトを設定する ワンタップ ログインのスタートガイドをご覧ください。

1. ワンタップ クライアントを構成する

アカウント作成用にワンタップ クライアントを構成する手順は次のとおりです。

  • パスワード認証情報リクエストを有効にしないでください。(ワンタップの登録は トークンベースの認証を使用します)。
  • setGoogleIdTokenRequestOptions() を使用して Google ID トークン リクエストを有効にする。 次の設定を行うことができます。

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 を閉じるか外側をタップして、結果が (コード RESULT_CANCELED に置き換えます)。アプリは両方の可能性に対応する必要があります。

Google ID トークンを使用してアカウントを作成する

ユーザーが Google アカウントでサインアップすることを選択した場合は、Google アカウントの ID トークンを onActivityResult() からワンタップにインテント データを渡してユーザーに通知を送信します。 クライアントの getSignInCredentialFromIntent() メソッドで確認できます。認証情報には 非 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 の表示を一時的に停止する必要があります。 繰り返しプロンプトでユーザーをイライラさせるのを防げます。次の例をご覧ください。 アクティビティにプロパティを設定することで、アクティビティに ユーザーにワンタップ ログインを提供するかどうかを決定する。別の動画で 値を 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 などです多くのアプリでは、この情報で十分です。 バックエンドでユーザーを認証し、新しいアカウントを作成します。

アカウントの作成を完了するために追加情報が必要な場合 登録の詳細を示すフローをユーザーに提示します。 追加情報を要求しますバックエンドに送信し、アカウントの作成を完了します。