Zintegruj Menedżera danych logowania z funkcją Zaloguj się przez Google

Plansza dolna z obsługą Menedżera danych logowania przedstawiająca różne tożsamości do wyboru.
Rysunek 1. Wygląd okna dialogowego Zaloguj się przez Google po integracji z interfejsem Credential Manager API.

Z tego dokumentu dowiesz się, jak przenieść okno Zaloguj się przez dolną planszę Google z usług Google Identity Services (GIS) do interfejsu Credentials Manager API przy użyciu biblioteki pomocniczej identyfikatora Google.

Aplikacja korzystająca z interfejsu Credential Manager API jest skonfigurowana w taki sposób, aby prezentować użytkownikowi spójny interfejs Androida, który umożliwia użytkownikowi wybór z listy zapisanych opcji logowania, w tym kont z włączonym kluczem dostępu. To jest zalecany interfejs API Androida do konsolidacji różnych typów danych logowania i od różnych dostawców. Od Androida 14 użytkownicy mogą też korzystać z zewnętrznych menedżerów haseł za pomocą interfejsu Credential Manager API.

Deklarowanie zależności

W pliku build.gradle modułu zadeklaruj zależności, używając najnowszej wersji:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Wykonaj instrukcje, aby skonfigurować projekt w konsoli interfejsów API Google. Zastąp wskazówki dotyczące uwzględniania zależności wspomnianymi wyżej instrukcjami.

Tworzenie instancji żądania logowania na konto Google

Aby rozpocząć implementację, utwórz instancję żądania logowania do Google. Użyj GetGoogleIdOption, aby pobrać token identyfikatora Google użytkownika.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Najpierw należy wywołać interfejs API z parametrem setFilterByAuthorizedAccounts ustawionym na true. Jeśli dane logowania są niedostępne, wywołaj ponownie interfejs API i ustaw setFilterByAuthorizedAccounts na false.

Jeśli chcesz, aby użytkownicy logowali się automatycznie, gdy to możliwe, włącz tę funkcję za pomocą funkcji setAutoSelectEnabled w swoim żądaniu do GetGoogleIdOption. Logowanie automatyczne jest możliwe, gdy są spełnione te kryteria:

  • Użytkownik ma dokładnie 1 zapisane dane logowania do Twojej aplikacji. Oznacza to, że jedno zapisane hasło lub jedno zapisane konto Google.
  • użytkownik nie wyłączył automatycznego logowania w ustawieniach konta Google;

Aby poprawić bezpieczeństwo logowania i uniknąć ataków typu replay, za pomocą metody setNonce umieszczaj w każdym żądaniu jednorazową liczbę. Więcej informacji o generowaniu liczby jednorazowej

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>);
  .build();

Zaloguj się przez Google

Aby skonfigurować proces Zaloguj się przez Google:

  1. Utwórz instancję GetCredentialRequest i dodaj utworzony powyżej element googleIdOption, aby pobrać dane logowania.
  2. Aby pobrać dostępne dane logowania użytkownika, przekaż to żądanie do wywołania getCredential() (Kotlin) lub getCredentialAsync() (Java).
  3. Gdy interfejs API się powiedzie, wyodrębnij CustomCredential, który zawiera wynik dla danych GoogleIdTokenCredential.
  4. Typ obiektu CustomCredential powinien być równy wartości GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL. Przekonwertuj obiekt na GoogleIdTokenCredential za pomocą metody GoogleIdTokenCredential.createFrom.
  5. Jeśli konwersja się powiedzie, wyodrębnij identyfikator GoogleIdTokenCredential, zweryfikuj go i uwierzytelnij dane logowania na serwerze.
  6. Jeśli konwersja z kodem GoogleIdTokenParsingException nie powiedzie się, być może musisz zaktualizować wersję biblioteki funkcji Zaloguj się przez Google.
  7. Przechwytuj wszystkie nierozpoznane niestandardowe typy danych logowania.

Kotlin

val request: GetCredentialRequest = Builder()
  .addGetCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Java

GetCredentialRequest request = new GetCredentialRequest.Builder()
  .addGetCredentialOption(googleIdOption)
  .build();

// Launch sign in flow and do getCredential Request to retrieve the credentials
credentialManager.getCredentialAsync(
  requireActivity(),
  request,
  cancellationSignal,
  <executor>,
  new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
    @Override
    public void onResult(GetCredentialResponse result) {
      handleSignIn(result);
    }

    @Override
    public void onError(GetCredentialException e) {
      handleFailure(e);
    }
  }
);

public void handleSignIn(GetCredentialResponse result) {
  // Handle the successfully returned credential.
  Credential credential = result.getCredential();

  if (credential instanceof PublicKeyCredential) {
    String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();
    // Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate
  } else if (credential instanceof PasswordCredential) {
    String username = ((PasswordCredential) credential).getId();
    String password = ((PasswordCredential) credential).getPassword();
    // Use id and password to send to your server to validate and authenticate
  } else if (credential instanceof CustomCredential) {
    if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
      try {
        // Use googleIdTokenCredential and extract id to validate and
        // authenticate on your server
        GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
      } catch (GoogleIdTokenParsingException e) {
        Log.e(TAG, "Received an invalid Google ID token response", e);
      }
    } else {
      // Catch any unrecognized custom credential type here.
      Log.e(TAG, "Unexpected type of credential");
    }
  } else {
    // Catch any unrecognized credential type here.
    Log.e(TAG, "Unexpected type of credential");
  }
}

Przycisk Zaloguj się przez Google

Przycisk Zaloguj się przez Google jest obsługiwany przez Menedżera danych logowania z najnowszą biblioteką pomocniczą identyfikatora Google. Aby uruchomić przycisk Zaloguj się przez Google, użyj GetSignInWithGoogleOption zamiast GetGoogleIdOption i obsługuj zwrócone elementy GoogleIdTokenCredential tak samo jak wcześniej.

Zarejestruj się z Google

Jeśli po ustawieniu z setFilterByAuthorizedAccounts na true podczas tworzenia wystąpienia żądania GetGoogleIdOption i przekazania do GetCredentialsRequest nie pojawiają się żadne wyniki, oznacza to, że nie ma autoryzowanych kont, na które można się zalogować. Na tym etapie skonfiguruj setFilterByAuthorizedAccounts(false) i wywołaj funkcję Sign up with Google (Zarejestruj się w Google).

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Po utworzeniu instancji żądania rejestracji Google uruchom proces uwierzytelniania w sposób podobny do opisanego w sekcji Zaloguj się przez Google.

Obsługa wylogowania

Gdy użytkownik wyloguje się z aplikacji, wywołaj metodę clearCredentialState() interfejsu API, aby wyczyścić bieżący stan danych logowania użytkownika i zresetować wewnętrzny stan logowania.