Используйте Google Smart Lock для oauth методов входа

Я использовал Google Smart Lock в одном из моих приложений для Android. Я сталкиваюсь с некоторыми проблемами при интеграции смарт-блокировки в мое приложение для методов входа с использованием oauth. Я использую Google, Facebook oauth в качестве методов входа, и они возвращают токен oauth и секрет oauth, которые я отправляю на сервер для аутентификации.

Теперь, как мне реализовать умную блокировку Google для этих методов?

Как я могу сохранить эти учетные данные с помощью смарт-блокировки, чтобы при последующем их чтении я мог получить их и использовать для проверки подлинности?

Можно ли вообще реализовать функцию умной блокировки Google с помощью пользовательских методов oauth? Я просмотрел множество источников в интернете, но не смог найти решения этой проблемы. Любая помощь будет оценена.

1 ответ

Нельзя хранить токены с текущим API Smart Lock, но вы можете сохранить тип учетной записи, выбранной пользователем. Например, чтобы помнить, что пользователь использовал OAuth с Google, создайте учетные данные, например:

Credential credential = new Credential.Builder(gsa.getEmail())
        .setAccountType(IdentityProviders.GOOGLE)
        .setName(gsa.getDisplayName())
        .setProfilePictureUri(gsa.getPhotoUrl())
        .build();

Вы можете определить свои собственные типы учетных записей. Если указанные адреса электронной почты соответствуют учетной записи Google на устройстве, эта запись может быть сохранена автоматически; в противном случае пользователь должен будет подтвердить, с какой учетной записью Google сохранить данные.

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

mCredentialRequest = new CredentialRequest.Builder()
    .setAccountTypes(IdentityProviders.GOOGLE)
    .build();

mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
      new OnCompleteListener<CredentialRequestResponse>() {
          @Override
          public void onComplete(@NonNull Task<CredentialRequestResponse> task) {

              if (task.isSuccessful()) {
onCredentialRetrieved(task.getResult().getCredential());
                  return;
              }
          }
      });

private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();

        GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
        Task<GoogleSignInAccount> task = signInClient.silentSignIn();
        // ...
    }
}

Как описано в документации: https://developers.google.com/identity/smartlock-passwords/android/retrieve-credentials

Другие вопросы по тегам