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:
- Utwórz instancję
GetCredentialRequest
i dodaj utworzony powyżej elementgoogleIdOption
, aby pobrać dane logowania. - Aby pobrać dostępne dane logowania użytkownika, przekaż to żądanie do wywołania
getCredential()
(Kotlin) lubgetCredentialAsync()
(Java). - Gdy interfejs API się powiedzie, wyodrębnij
CustomCredential
, który zawiera wynik dla danychGoogleIdTokenCredential
. - Typ obiektu
CustomCredential
powinien być równy wartościGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
. Przekonwertuj obiekt naGoogleIdTokenCredential
za pomocą metodyGoogleIdTokenCredential.createFrom
. - Jeśli konwersja się powiedzie, wyodrębnij identyfikator
GoogleIdTokenCredential
, zweryfikuj go i uwierzytelnij dane logowania na serwerze. - Jeśli konwersja z kodem
GoogleIdTokenParsingException
nie powiedzie się, być może musisz zaktualizować wersję biblioteki funkcji Zaloguj się przez Google. - 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.