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. Dzięki temu możesz udostępniać dostęp do aplikacji na dowolnym urządzeniu na Androidzie, iOS i w przeglądarce.
Aby skonfigurować logowanie z Google, wykonaj te 2 główne czynności:
Skonfiguruj opcję Zaloguj się 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ę.
Dodaj przycisk Zaloguj się przez Google do interfejsu aplikacji. 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.
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
- Otwórz projekt w Konsoli interfejsów API lub utwórz nowy, jeśli go jeszcze nie masz.
- Na ekranie akceptacji OAuth sprawdź, czy wszystkie informacje są kompletne i poprawne.
- 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.
- Sprawdź, czy adresy URL polityki prywatności i warunków korzystania z aplikacji są prawidłowe.
- 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.
- Otwórz stronę Dane logowania.
- Kliknij Utwórz dane logowania > Identyfikator klienta OAuth.
- Wybierz typ aplikacji Android.
- 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.
- Otwórz stronę Dane logowania.
- Kliknij Utwórz dane logowania > Identyfikator klienta OAuth.
- 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:
- Utwórz instancję
GetCredentialRequest
, a potem dodaj utworzony wcześniej obiektgoogleIdOption
, używając do tego celu parametruaddCredentialOption()
. - Przekaż to żądanie do wywołania
getCredential()
(Kotlin) lubgetCredentialAsync()
(Java), aby pobrać dostępne dane logowania użytkownika. - Po udanym wywołaniu interfejsu API wyodrębnij element
CustomCredential
, który zawiera wynik dla danychGoogleIdTokenCredential
. - Typ parametru
CustomCredential
powinien być równy wartości parametruGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
. Za pomocą metodyGoogleIdTokenCredential.createFrom
przekształc obiekt wGoogleIdTokenCredential
. Jeśli konwersja się powiedzie, wyodrębnij identyfikator
GoogleIdTokenCredential
, potwierdź go i uwierzytelnij na serwerze.Jeśli konwersja nie powiedzie się z powodu
GoogleIdTokenParsingException
, konieczne może być zaktualizowanie wersji Biblioteki logowania z Google.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 wartości 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źć żadnego konta, poproś użytkownika o zarejestrowanie się za pomocą konta Google, używając 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, aby ograniczyć opcje logowania w przyszłych wywołaniach get-credential. Na przykład może ona 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.