Funkcja Zaloguj się przez Google ułatwia szybką integrację uwierzytelniania użytkowników z aplikacją na Androida. Użytkownicy mogą logować się w aplikacji za pomocą konta Google, wyrażać na nie zgodę oraz bezpiecznie udostępniać w niej informacje ze swojego profilu. Biblioteka Jetpack w Androidzie Credential Manager umożliwia płynną integrację, zapewniając spójną obsługę na różnych urządzeniach z Androidem za pomocą 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ć opcję Logowanie przez 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ę.
Dodaj przycisk Zaloguj się przez Google do interfejsu aplikacji. Przycisk Zaloguj się przez Google to wygodny sposób, w jaki użytkownicy mogą rejestrować się w aplikacjach na Androida lub logować się w nich za pomocą istniejących kont Google. Użytkownicy mogą kliknąć przycisk Zaloguj się przez Google, jeśli zamykają interfejs u dołu strony lub jeśli tylko chcą używać konta Google do rejestracji i logowania. 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.
Skonfiguruj projekt 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ę, prześlij prośbę o zalogowanie się przez 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 wcześniej były 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óre chcą 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. Zapewnia to płynne działanie na różnych urządzeniach, zwłaszcza podczas przenoszenia danych na inne urządzenie, gdzie użytkownicy mogą szybko odzyskać dostęp do konta bez ponownego podawania danych logowania. Dzięki temu unikniesz niepotrzebnych utrudnień, które będą utrudniać korzystanie z usług użytkownikom, którzy byli już zalogowani.
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 w przypadku implementacji automatycznego logowania prawidłowo obsługiwać wylogowanie. Dzięki temu użytkownicy będą 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 do każdego żądania dołączać 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ć funkcję Zaloguj się przez Google:
- Utwórz instancję
GetCredentialRequest
, a następnie dodaj wcześniej utworzonygoogleIdOption
za pomocąaddCredentialOption()
, aby pobrać dane logowania. - 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
, zweryfikuj go i uwierzytelnij dane logowania na serwerze.Jeśli konwersja nie powiedzie się z powodu
GoogleIdTokenParsingException
, konieczne może być zaktualizowanie wersji Biblioteki funkcji Logowanie 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 za pomocą przycisku
Aby aktywować funkcję 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 opisem w przypadku zwróconego parametru GoogleIdTokenCredential
, jak w przykładowym kodzie poniżej.
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 wystąpienia żądania logowania 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 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)
nie ma już używanych wcześniej 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 wystąpienia żądania rejestracji 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 autouzupełniania. Gdy użytkownik utworzy konto, rozważ zachęcenie go do korzystania z kluczy dostępu jako ostatniego kroku w procesie tworzenia konta.
Obsługa wylogowania
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 zapisać aktywną sesję danych logowania i używać jej do ograniczania opcji 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.