Uwierzytelnianie użytkowników za pomocą funkcji Zaloguj się przez Google

Zaloguj się przez Google pozwala szybko zintegrować uwierzytelnianie użytkownika z aplikacją na Androida. Użytkownicy mogą logować się w aplikacji za pomocą konta Google, wyrażać zgodę i bezpiecznie udostępniać informacje z profilu. Menedżer danych logowania Jetpacka na Androida ułatwia integrację, zapewniając spójne działanie na różnych urządzeniach z Androidem przy użyciu jednego interfejsu API.

W tym dokumencie znajdziesz wskazówki dotyczące implementowania funkcji Zaloguj się przez Google w aplikacjach na Androida, konfigurowania interfejsu przycisku Zaloguj się przez Google oraz konfigurowania rejestracji i logowania jednym dotknięciem zoptymalizowanych pod kątem aplikacji Aby umożliwić płynne przechodzenie na nowe urządzenia, funkcja Zaloguj się przez Google obsługuje logowanie automatyczne. Jej działanie na różnych platformach (Android, iOS i internet) ułatwia logowanie w aplikacji na dowolnym urządzeniu.

Aby skonfigurować logowanie z Google, wykonaj te 2 główne czynności:

Skonfiguruj opcję Logowanie przez Google w interfejsie Menedżera danych logowania Możesz skonfigurować automatyczne wyświetlanie użytkownikowi prośby o logowanie. Jeśli masz wdrożone klucze dostępu lub hasła, możesz poprosić o wszystkie odpowiednie typy danych logowania jednocześnie, aby użytkownik nie musiał pamiętać, której opcji użył wcześniej do zalogowania się.

Plansza dolna Menedżera danych logowania
Rysunek 1. Dolna część strony Menedżera danych logowania z interfejsem wyboru danych logowania

Dodaj do interfejsu aplikacji przycisk Zaloguj się przez Google. Przycisk Zaloguj się przez Google oferuje użytkownikom uproszczony sposób rejestrowania się i logowania w aplikacjach na Androida za pomocą istniejących kont Google. Użytkownicy klikają przycisk Zaloguj się przez Google, jeśli zamkną interfejs dolnego panelu lub jeśli chcą zalogować się na swoje konto Google. Dla deweloperów oznacza to łatwiejsze wprowadzanie użytkowników i mniej problemów podczas rejestracji.

Animacja pokazująca proces logowania 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 dialog dolnego panelu z interfejsem Credential Manager API za pomocą biblioteki pomocniczej Google ID.

Konfigurowanie projektu w Konsoli interfejsów API Google

  1. Otwórz projekt w Konsoli interfejsu API lub utwórz nowy, jeśli go jeszcze nie masz.
  2. Na ekranie akceptacji OAuth sprawdź, czy wszystkie informacje są kompletne i poprawne.
    1. Sprawdź, czy nazwa, logo i strona główna aplikacji są poprawne. Te wartości będą wyświetlane użytkownikom na ekranie zgody funkcji Zaloguj się przez Google podczas rejestracji oraz na ekranie Aplikacje i usługi innych firm.
    2. Sprawdź, czy adresy URL polityki prywatności i warunków korzystania z aplikacji są prawidłowe.
  3. Na stronie Dane logowania utwórz identyfikator klienta 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 danych logowania utwórz nowy identyfikator klienta „Aplikacja internetowa”, jeśli jeszcze go nie masz. Pola „Authorized JavaScript origins” (Autoryzowane źródła JavaScript) i „Authorized redirect URIs” (Autoryzowane identyfikatory URI przekierowania) możesz na razie zignorować. Ten identyfikator klienta będzie służyć do identyfikowania serwera zaplecza 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, korzystając z 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 się przez Google

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

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 aplikacji. Aby to zrobić, wywołaj interfejs API, ustawiając parametr setFilterByAuthorizedAccounts na wartość true. Użytkownicy mogą wybrać jedno z dostępnych kont, aby się zalogować.

Jeśli nie ma autoryzowanych kont Google, użytkownik powinien zostać poproszony o zalogowanie się na dowolne dostępne konto. Aby to zrobić, wyświetl użytkownikowi prośbę o ponowne wywołanie interfejsu API i ustawienie wartości setFilterByAuthorizedAccounts na false. Więcej informacji o rejestracji

Włączanie automatycznego logowania dla powracających użytkowników (zalecane)

Deweloperzy powinni włączyć automatyczne logowanie dla użytkowników, którzy rejestrują się za pomocą jednego konta. Dzięki temu użytkownicy mogą płynnie korzystać z usługi na różnych urządzeniach, zwłaszcza podczas przenoszenia danych na inne urządzenie, gdzie mogą szybko odzyskać dostęp do konta bez ponownego podawania danych logowania. Dzięki temu użytkownicy nie będą musieli ponownie logować się na swoje konta.

Aby włączyć logowanie automatyczne, użyj setAutoSelectEnabled(true). Automatyczne logowanie jest możliwe tylko wtedy, gdy są spełnione te kryteria:

  • Prośba odpowiada tylko jednemu zestawowi danych logowania, którym może być konto Google lub hasło, które pasuje do domyślnego konta na urządzeniu z Androidem.
  • Użytkownik nie wylogował się w prosty sposób.
  • Użytkownik nie wyłączył logowania automatycznego w 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, aby podczas wdrażania automatycznego logowania odpowiednio obsługiwać wylogowywanie, aby użytkownicy mogli zawsze wybrać odpowiednie konto po wylogowaniu się z aplikacji.

Ustaw wartość nonce, aby zwiększyć bezpieczeństwo

Aby zwiększyć bezpieczeństwo logowania i uniknąć ataków polegających na odtwarzaniu pakietów danych, dodaj setNonce, aby w każdym żądaniu uwzględnić losowy ciąg znaków. Więcej informacji o generowaniu liczby losowej

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 logowania się przez Google

Aby skonfigurować proces logowania się z Google, wykonaj te czynności:

  1. Utwórz instancję GetCredentialRequest, a potem dodaj utworzony wcześniej obiekt googleIdOption, używając do tego celu parametru addCredentialOption().
  2. Przekaż to żądanie do wywołania getCredential() (Kotlin) lub getCredentialAsync() (Java), aby pobrać dostępne dane logowania użytkownika.
  3. Po udanym wywołaniu interfejsu API wyodrębnij element CustomCredential, który zawiera wynik dla danych GoogleIdTokenCredential.
  4. Typ parametru CustomCredential powinien być równy wartości parametru GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL. Za pomocą metody GoogleIdTokenCredential.createFrom przekształc obiekt w GoogleIdTokenCredential.
  5. Jeśli konwersja się powiedzie, wyodrębnij identyfikator GoogleIdTokenCredential, potwierdź go i uwierzytelnij na serwerze.

  6. Jeśli konwersja nie powiedzie się z powodu GoogleIdTokenParsingException, konieczne może być zaktualizowanie wersji Biblioteki logowania z Google.

  7. Wykrywaj nierozpoznane typy niestandardowych 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 the ID to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
          // You can use the members of googleIdTokenCredential directly for UX
          // purposes, but don't use them to store or control access to user
          // data. For that you first need to validate the token:
          // pass googleIdTokenCredential.getIdToken() to the backend server.
          GoogleIdTokenVerifier verifier = ... // see validation instructions
          GoogleIdToken idToken = verifier.verify(idTokenString);
          // To get a stable account identifier (e.g. for storing user data),
          // use the subject ID:
          idToken.getPayload().getSubject()
        } 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")
    }
  }
}

Uruchamianie procesu logowania się przez Google

Aby wywołać przepływ przycisku Zaloguj się przez Google, zamiast GetGoogleIdOption użyj GetSignInWithGoogleOption:

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

Postępuj zgodnie z instrukcjami podanymi w przykładowym kodzie, aby obsłużyć zwróconą wartość GoogleIdTokenCredential.

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 uruchomieniu wystąpienia żądania logowania w Google uruchom proces uwierzytelniania w sposób podobny do opisanego w sekcji Logowanie przez Google.

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

Zaloguj się przez Google to najprostszy sposób na utworzenie nowego konta w aplikacji lub usłudze w kilka kliknięć.

Jeśli nie znaleziono zapisanych danych logowania (żadne konta Google nie zostały zwrócone przez getGoogleIdOption), poproś użytkownika o rejestrację. Najpierw sprawdź, czy setFilterByAuthorizedAccounts(true), aby sprawdzić, czy nie ma żadnych wcześniej używanych kont. Jeśli nie uda się znaleźć żadnych kont, poproś użytkownika o zarejestrowanie się za pomocą konta Google.setFilterByAuthorizedAccounts(false)

Przykład:

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

Po utworzeniu prośby o rejestrację w Google uruchom proces uwierzytelniania. Jeśli użytkownicy nie chcą rejestrować się za pomocą funkcji Zaloguj się przez Google, rozważ zoptymalizowanie aplikacji pod kątem automatycznego wypełniania pól. Gdy użytkownik utworzy konto, rozważ zachęcenie go do korzystania z kluczy dostępu jako ostatniego kroku w procesie tworzenia konta.

Wylogowanie

Gdy użytkownik wyloguje się z aplikacji, wywołaj metodę interfejsu API clearCredentialState(), aby wyczyścić stan danych logowania bieżącego użytkownika we wszystkich dostawcach danych logowania. Spowoduje to powiadomienie wszystkich dostawców danych logowania, że należy usunąć wszystkie zapisane dane logowania dla danej aplikacji.

Dostawca danych logowania może przechowywać aktywną sesję danych logowania i korzystać z niej do ograniczania opcji logowania w przyszłych wywołaniach get-credential. Może na przykład nadać priorytet aktywnym danym logowania nad innymi dostępnymi danymi. Gdy użytkownik wyloguje się z aplikacji, aby następnym razem wyświetlić pełne opcje logowania, należy wywołać ten interfejs API, aby dostawca mógł wyczyścić wszystkie zapisane dane logowania.