Предупреждение: эти данные предоставляются в соответствии с Политикой в ​​отношении данных пользователей Google . Ознакомьтесь с политикой и соблюдайте ее. Невыполнение этого требования может привести к приостановке проекта или приостановке действия учетной записи.

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

Используйте клиент входа One Tap, чтобы запросить у пользователя разрешение на получение одной из учетных данных, которые они ранее использовали для входа в ваше приложение. Эти учетные данные могут быть либо учетной записью Google, либо комбинацией имени пользователя и пароля, которую они сохранили в Google с помощью Chrome, автозаполнения Android или Smart Lock для паролей.

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

После успешного получения учетных данных вы можете использовать их для беспрепятственного входа пользователя в свое приложение.

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

Где мне использовать вход в систему одним касанием?

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

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

Необязательные приложения для входа также должны использовать вход одним касанием на своих экранах входа по причинам, указанным выше.

Прежде чем вы начнете

1. Настройте клиент для входа в систему в одно касание.

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

Если ваше приложение использует пароль на основе входа, используйте setPasswordRequestOptions() для того, чтобы пароль учетных запросов.

Если ваше приложение использует Google для входа в систему , использование setGoogleIdTokenRequestOptions() , чтобы включить и настроить Google ID лексем запросы:

  • Установите клиент - сервер идентификатор идентификатор созданного в консоли Google APIs . Обратите внимание, что это идентификатор клиента вашего сервера, а не идентификатор клиента Android.

  • Настройте клиент для фильтрации по авторизованным учетным записям. Когда вы включаете эту опцию, клиент One Tap только предлагает пользователям войти в ваше приложение с учетными записями Google, которые они уже использовали в прошлом. Это может помочь пользователям успешно войти в систему, если они не уверены, есть ли у них уже учетная запись или какую учетную запись Google они использовали, а также предотвратит случайное создание пользователями новых учетных записей в вашем приложении.

  • Если вы хотите , чтобы подписать пользователей автоматически , когда это возможно, включить функцию с setAutoSelectEnabled() . Автоматический вход возможен при соблюдении следующих критериев:

    • Для вашего приложения у пользователя сохранены ровно одни учетные данные. То есть один сохраненный пароль или одна сохраненная учетная запись Google.
    • Пользователь не отключил автоматический вход в в своих настройках аккаунта Google .
  • Хотя это необязательно, мы настоятельно рекомендуем вам использовать одноразовый номер, чтобы повысить безопасность входа и избежать атак повторного воспроизведения. Используйте setNonce включить случайное слово в каждом запросе. См SafetyNet это Получить нонс раздел для предложений и дополнительные детали на создание одноразового номера.

Джава

public class YourActivity extends AppCompatActivity {
  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signInRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signInRequest = BeginSignInRequest.builder()
              .setPasswordRequestOptions(PasswordRequestOptions.builder()
                      .setSupported(true)
                      .build())
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.default_web_client_id))
                      // Only show accounts previously used to sign in.
                      .setFilterByAuthorizedAccounts(true)
                      .build())
              // Automatically sign in when exactly one credential is retrieved.
              .setAutoSelectEnabled(true)
              .build();
      // ...
  }
  // ...
}

Котлин

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signInRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signInRequest = BeginSignInRequest.builder()
            .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
                .setSupported(true)
                .build())
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Only show accounts previously used to sign in.
                    .setFilterByAuthorizedAccounts(true)
                    .build())
            // Automatically sign in when exactly one credential is retrieved.
            .setAutoSelectEnabled(true)
            .build()
        // ...
    }
    // ...
}

2. Проверьте, есть ли вошедший в систему пользователь.

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

Вы также должны отслеживать, отказался ли пользователь от входа в систему одним касанием, закрыв приглашение или нажав за пределами его. Это может быть просто логическое свойство вашей Activity. (См Остановка отображения One Tap UI , ниже.)

3. Отображение пользовательского интерфейса для входа в систему одним касанием.

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

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

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

Джава

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 saved credentials found. Launch the One Tap sign-up flow, or
                // do nothing and continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

Котлин

oneTapClient.beginSignIn(signInRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0, null)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No saved credentials found. Launch the One Tap sign-up flow, or
        // do nothing and continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

4. Обработайте ответ пользователя.

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

Войдите в систему с полученными учетными данными

Если пользователь выбрал учетные данные акций с приложением, вы можете получить их, передавая данные о намерении из onActivityResult() к одной Tap клиента getSignInCredentialFromIntent() метод. Верительных будет иметь непустое googleIdToken свойство , если пользователь разделяет учетные данные учетной записи Google с вашим приложением, или непустой password свойство , если пользователь разделяет сохраненный пароль.

Используйте учетные данные для аутентификации в серверной части вашего приложения.

  • Если была получена пара имени пользователя и пароля, используйте их для входа так же, как если бы пользователь ввел их вручную.
  • Если были получены учетные данные учетной записи Google, используйте токен идентификатора для аутентификации на сервере. Если вы решили использовать одноразовый номер, чтобы избежать атак с повторением, проверьте значение ответа на своем внутреннем сервере. См Идентифицироваться с бекенд использованием идентификационных маркеров .

Джава

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();
                  String username = credential.getId();
                  String password = credential.getPassword();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  } else if (password != null) {
                      // Got a saved username and password. Use them to authenticate
                      // with your backend.
                      Log.d(TAG, "Got password.");
                  }
              } 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
                    val username = credential.id
                    val password = credential.password
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        password != null -> {
                            // Got a saved username and password. Use them to authenticate
                            // with your backend.
                            Log.d(TAG, "Got password.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token or password!")
                        }
                    }
                } catch (e: ApiException) {
                    // ...
                }
            }
        }
    }
    // ...
}

Прекратить отображение пользовательского интерфейса One Tap

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

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

Джава

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

5. Обработка выхода

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

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

Следующие шаги

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

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