Создавайте новые учетные записи одним нажатием

Если вы поддерживаете вход через учетные записи Google, вы можете использовать клиент One Tap для создания учетных записей, который также упростит процесс создания учетных записей для ваших пользователей и не выведет их из контекста вашего приложения.

Пользовательский интерфейс регистрации в одно касание

При отображении интерфейса One Tap пользователям предлагается создать новую учетную запись в вашем приложении, используя одну из учетных записей Google на их устройстве. Если пользователь решит продолжить, вы получите токен ID с основной информацией профиля — его именем, фотографией профиля и подтвержденным адресом электронной почты — который вы можете использовать для создания новой учетной записи.

Внедрение системы создания учетных записей одним касанием состоит из двух частей:

  • Интеграция клиента One Tap в ваше приложение описана на этой странице. В основном это то же самое, что и использование входа через One Tap, но с некоторыми отличиями в конфигурации.
  • Добавление в вашу серверную часть возможности создания учетных записей пользователей на основе токенов Google ID описано в разделе «Использование токенов ID в серверной части» .

Где мне следует использовать регистрацию в один клик?

Наиболее эффективное применение функции регистрации в один клик — это когда вход в систему открывает доступ к новым функциям. Сначала попробуйте войти в систему пользователя, используя сохраненные учетные данные. Если сохраненные учетные данные не найдены, предложите пользователю создать новую учетную запись.

Прежде чем начать

Настройте свой проект Google APIs Console и проект Android, как описано в разделе «Начало работы с авторизацией в один клик» .

1. Настройте клиент One Tap.

Для настройки клиента One Tap для создания учетных записей выполните следующие действия:

  • Не разрешайте запросы на ввод пароля. (Регистрация в одно касание возможна только при аутентификации на основе токенов.)
  • Включите запросы токенов Google ID с помощью setGoogleIdTokenRequestOptions() и следующих настроек:

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();

      // ...
  }
}

Котлин

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. Следите за отменой действий в пользовательском интерфейсе одним касанием.

Вам следует отслеживать, отказался ли пользователь от использования регистрации в один клик, закрыв окно запроса или коснувшись его. Для этого достаточно просто задать логическое свойство в вашем Activity. (См. раздел «Прекратить отображение интерфейса регистрации в один клик» ниже.)

3. Отобразить пользовательский интерфейс регистрации в один клик.

Если пользователь не отказался от использования One Tap для создания новой учетной записи, вызовите метод beginSignIn() объекта клиента и прикрепите обработчики событий к возвращаемой им Task . Приложения обычно выполняют этот шаг, когда запрос на вход через One Tap не находит сохраненных учетных данных — то есть, в обработчике ошибки запроса на вход .

Клиент One Tap вызовет обработчик успешного выполнения, если у пользователя на устройстве настроена одна или несколько учетных записей Google. В обработчике успешного выполнения получите ожидающее намерение из результата Task и передайте его в метод startIntentSenderForResult() для запуска пользовательского интерфейса One Tap.

Если у пользователя нет учетных записей Google на устройстве, клиент One Tap вызовет обработчик ошибки. В этом случае никаких действий не требуется: вы можете просто продолжить отображение страницы выхода из системы, и пользователь сможет зарегистрироваться с помощью стандартного процесса создания учетной записи.

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());
            }
        });

Котлин

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. Обработка ответа пользователя.

Ответ пользователя на запрос регистрации в One Tap будет передан в ваше приложение с помощью метода onActivityResult() вашего Activity. Если пользователь решил создать учетную запись, результатом будет токен Google ID. Если пользователь отказался от регистрации, закрыв интерфейс One Tap или нажав за его пределами, будет возвращен код RESULT_CANCELED . Ваше приложение должно обрабатывать обе возможности.

Создайте учетную запись, используя токен Google ID.

Если пользователь зарегистрировался с помощью учетной записи Google, вы можете получить токен идентификации пользователя, передав данные намерения из метода onActivityResult() в метод getSignInCredentialFromIntent() клиента One Tap. Учетные данные будут иметь ненулевое свойство 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;
      }
  }
}

Котлин

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) {
                    // ...
            }
        }
    }
    // ...
}

Прекратить отображение интерфейса «Одно касание»

Если пользователь откажется от входа в систему, вызов метода getSignInCredentialFromIntent() вызовет ApiException со статусом CommonStatusCodes.CANCELED . В этом случае следует временно отключить отображение интерфейса входа в систему одним касанием, чтобы не раздражать пользователей повторными запросами. В следующем примере это достигается путем установки свойства в Activity, которое используется для определения того, предлагать ли пользователю вход в систему одним касанием; однако вы также можете сохранить значение в SharedPreferences или использовать другой метод.

Важно установить собственное ограничение количества запросов на вход в One Tap. В противном случае, если пользователь отменит несколько запросов подряд, клиент One Tap не будет запрашивать у него вход в течение следующих 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;
      }
  }
}

Котлин

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-адрес изображения профиля. Для многих приложений этой информации достаточно для аутентификации пользователя на стороне сервера и создания новой учетной записи.

Если для завершения создания учетной записи требуется дополнительная информация — например, дата рождения пользователя — предложите пользователю пройти процедуру регистрации, в ходе которой вы запросите эти дополнительные данные. Затем отправьте запрос в вашу бэкэнд-систему для завершения создания учетной записи.