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

Funkcja Zaloguj się przez Google pomaga szybko zintegrować uwierzytelnianie użytkowników z aplikacją na Androida. Użytkownicy mogą logować się w aplikacji, wyrażać zgodę na wykorzystanie danych i bezpiecznie udostępniać informacje profilowe za pomocą swojego konta Google. Biblioteka Menedżera danych logowania Jetpack na Androida ułatwia tę integrację, zapewniając spójne wrażenia na wszystkich urządzeniach z Androidem za pomocą jednego interfejsu API.

Z tego dokumentu dowiesz się, jak wdrożyć funkcję Zaloguj się przez Google w aplikacjach na Androida, jak skonfigurować interfejs przycisku Zaloguj się przez Google oraz jak skonfigurować proces rejestracji i logowania zoptymalizowany pod kątem aplikacji jednym kliknięciem. Aby płynnie migrować dane z urządzeń, funkcja Zaloguj się przez Google obsługuje automatyczne logowanie, a jej wieloplatformowy charakter na urządzeniach z Androidem, iOS i w przeglądarce ułatwia logowanie się w aplikacji na dowolnym urządzeniu.

Aby skonfigurować funkcję Zaloguj się przez Google, wykonaj te 2 główne czynności:

Skonfiguruj Zaloguj się przez Google jako opcję interfejsu użytkownika najniższego arkusza Menedżera danych logowania. Możesz skonfigurować to ustawienie tak, aby użytkownik był automatycznie proszony o zalogowanie się. Jeśli wdrożysz klucze dostępu lub hasła, możesz poprosić o wszystkie potrzebne typy danych logowania jednocześnie, aby użytkownik nie musiał pamiętać opcji użytej wcześniej do logowania.

Plansza dolna Menedżera danych logowania
Rysunek 1. Dolny interfejs Menedżera danych logowania do wyboru danych logowania

Dodaj przycisk Zaloguj się przez Google do interfejsu aplikacji. Przycisk Zaloguj się przez Google ułatwia użytkownikom korzystanie z istniejących kont Google do rejestracji i logowania się w aplikacjach na Androida. Użytkownicy mogą kliknąć przycisk Zaloguj się przez Google, jeśli zamkną interfejs u dołu lub będą chcieli użyć konta Google do rejestracji i logowania. Dla deweloperów oznacza to łatwiejsze wprowadzenie użytkowników i ułatwia im rejestrację.

Animacja pokazująca proces Zaloguj się przez Google
Rysunek 2. Interfejs użytkownika przycisku Zaloguj się przez Google w Menedżerze danych logowania

Z tego dokumentu dowiesz się, jak zintegrować przycisk Zaloguj się przez Google i okno na dole ekranu z interfejsem Credential Manager API za pomocą biblioteki pomocniczej identyfikatora Google.

Konfigurowanie projektu w konsoli interfejsów API Google

  1. Otwórz swój projekt w konsoli interfejsów API lub utwórz projekt, jeśli jeszcze go nie masz.
  2. Upewnij się, że wszystkie informacje na ekranie zgody OAuth są kompletne i dokładne.
    1. Upewnij się, że do aplikacji przypisano prawidłową nazwę, logo i stronę główną aplikacji. Użytkownicy będą widzieć te wartości na ekranie zgody Zaloguj się przez Google podczas rejestracji oraz na ekranie Aplikacje i usługi innych firm.
    2. Upewnij się, że masz podane adresy URL polityki prywatności i warunków korzystania z aplikacji.
  3. Na stronie Dane logowania utwórz identyfikator klienta na Androida dla swojej aplikacji, jeśli jeszcze go nie masz. Musisz podać nazwę pakietu aplikacji i podpis SHA-1.
    1. Otwórz stronę Dane logowania.
    2. Kliknij Utwórz dane logowania > Identyfikator klienta OAuth.
    3. Wybierz typ aplikacji Android.
  4. Na stronie Dane logowania utwórz nowy identyfikator klienta „Aplikacja internetowa”, jeśli jeszcze go nie masz. Na razie możesz zignorować pola „Autoryzowane źródła JavaScript” i „Autoryzowane identyfikatory URI przekierowania”. Będzie on używany do identyfikowania serwera backendu podczas komunikacji z usługami uwierzytelniania Google.
    1. Otwórz stronę Dane logowania.
    2. Kliknij Utwórz dane logowania > Identyfikator klienta OAuth.
    3. Wybierz typ aplikacji internetowej.

Deklarowanie zależności

W pliku build.gradle modułu zadeklaruj zależności przy użyciu najnowszej wersji Menedżera danych logowania:

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>"
}

Tworzenie instancji żądania logowania na konto Google

Aby rozpocząć implementację, zainicjuj żądanie logowania do Google. Użyj GetGoogleIdOption, aby pobrać token identyfikatora Google użytkownika.

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

Najpierw sprawdź, czy użytkownik ma jakieś konta, które były wcześniej używane do logowania się w Twojej aplikacji. Aby to zrobić, wywołaj interfejs API z parametrem setFilterByAuthorizedAccounts ustawionym na true. Użytkownicy mogą wybierać spośród dostępnych kont, na których chcą się zalogować.

Jeśli nie ma dostępnych autoryzowanych kont Google, użytkownik powinien zostać poproszony o zarejestrowanie się przy użyciu dowolnego z dostępnych kont. Aby to zrobić, poproś użytkownika o ponowne wywołanie interfejsu API i ustawienie setFilterByAuthorizedAccounts na false. Więcej informacji o rejestracji

Włącz logowanie automatyczne dla powracających użytkowników (zalecane)

Deweloperzy powinni włączyć automatyczne logowanie dla użytkowników, którzy rejestrują się za pomocą swojego pojedynczego konta. Zapewnia to bezproblemową obsługę na różnych urządzeniach, zwłaszcza podczas migracji urządzeń, w ramach której użytkownicy mogą szybko odzyskać dostęp do konta bez konieczności ponownego wpisywania danych logowania. Dzięki temu użytkownicy nie będą musieli już się logować.

Aby włączyć logowanie automatyczne, użyj adresu setAutoSelectEnabled(true). Logowanie automatyczne jest możliwe tylko po spełnieniu tych kryteriów:

  • Istnieją dane logowania pasujące do żądania, takie jak konto Google lub hasło. Są one zgodne z domyślnym kontem na urządzeniu z Androidem.
  • Użytkownik nie wylogował się bezpośrednio.
  • użytkownik nie wyłączył automatycznego logowania w swoich ustawieniach konta Google;
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Pamiętaj, by podczas implementacji automatycznego logowania ustawić prawidłowe wylogowywanie się, aby użytkownicy mogli zawsze wybrać właściwe konto po pierwszym wylogowaniu się z aplikacji.

Ustaw liczbę jednorazową, aby zwiększyć bezpieczeństwo

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

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

Tworzenie procesu Zaloguj się przez Google

Aby skonfigurować proces Zaloguj się przez Google:

  1. Utwórz instancję GetCredentialRequest, a następnie dodaj wcześniej utworzone googleIdOption za pomocą narzędzia addCredentialOption(), 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 właściwości CustomCredential powinien być równy wartości GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL. Przekonwertuj obiekt na GoogleIdTokenCredential, korzystając z metody GoogleIdTokenCredential.createFrom.
  5. Jeśli konwersja się powiedzie, wyodrębnij identyfikator GoogleIdTokenCredential, sprawdź 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.

val request: GetCredentialRequest = Builder()
  .addCredentialOption(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) {

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

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

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

Aktywowanie procesu przycisku Zaloguj się przez Google

Aby uruchomić przycisk Zaloguj się przez Google, użyj parametru GetSignInWithGoogleOption zamiast GetGoogleIdOption:

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder()
  .setServerClientId(WEB_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Zwrócony element GoogleIdTokenCredential możesz obsługiwać w sposób opisany w poniższym przykładowym kodzie.

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

  when (credential) {
    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 credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

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

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

Włącz rejestrację dla nowych użytkowników (zalecane)

Zaloguj się przez Google to najprostszy sposób, aby za pomocą kilku kliknięć utworzyć nowe konto w Twojej aplikacji lub usłudze.

Jeśli nie znajdzie żadnych zapisanych danych logowania (nie ma kont Google zwróconych przez getGoogleIdOption), poproś użytkownika o zarejestrowanie się. Najpierw sprawdź, czy setFilterByAuthorizedAccounts(true) nie ma już używanych wcześniej kont. Jeśli nie zostanie znaleziony, poproś użytkownika o zarejestrowanie się za pomocą konta Google za pomocą adresu setFilterByAuthorizedAccounts(false)

Przykład:

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

Po utworzeniu instancji prośby o rejestrację w Google uruchom proces uwierzytelniania. Jeśli użytkownicy nie chcą rejestrować się w Google, rozważ użycie usług autouzupełniania lub kluczy dostępu do tworzenia kont.

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 od wszystkich dostawców danych logowania. Spowoduje to powiadomienie wszystkich dostawców danych logowania, że każda zapisana sesja danych logowania powinna zostać wyczyszczona.

Dostawca danych logowania mógł zapisać aktywną sesję danych logowania i użyć jej do ograniczenia opcji logowania na potrzeby przyszłych wywołań metody get danych logowania. Aktywne dane logowania mogą na przykład mieć wyższy priorytet niż inne dostępne dane logowania. Gdy użytkownik wyraźnie wyloguje się z aplikacji, aby następnym razem uzyskać dostęp do wszystkich opcji logowania, należy wywołać ten interfejs API. Pozwoli to dostawcy wyczyścić wszystkie przechowywane dane logowania.