In diesem Dokument wird erläutert, wie Sie das Dialogfeld „Über Google anmelden“ am unteren Rand von Google Identity Services (GIS) mithilfe der Hilfsbibliothek Google ID zur Credentials Manager API migrieren.
Eine App, die die Credential Manager API verwendet, ist so konfiguriert, dass dem Endnutzer eine konsistente Android-Benutzeroberfläche angezeigt wird, über die der Nutzer aus einer Liste mit gespeicherten Anmeldeoptionen auswählen kann, einschließlich Konten mit aktiviertem Passkey. Dies ist die empfohlene Android API zum Konsolidieren verschiedener Arten und Anbieter von Anmeldedaten. Ab Android 14 können Nutzer auch Passwortmanager von Drittanbietern mit der Credential Manager API verwenden.
Abhängigkeiten deklarieren
Deklarieren Sie in der Datei build.gradle
Ihres Moduls Abhängigkeiten mithilfe der neuesten Version:
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>"
}
Folgen Sie dieser Anleitung, um Ihr Google API Console-Projekt einzurichten. Ersetzen Sie die Anleitung zum Einbeziehen von Abhängigkeiten durch die oben genannte Anleitung.
Google Log-in-Anfrage instanziieren
Instanziieren Sie zuerst eine Google Log-in-Anfrage, um mit der Implementierung zu beginnen. Verwenden Sie GetGoogleIdOption
, um das Google-ID-Token eines Nutzers abzurufen.
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();
Rufen Sie zuerst die API auf und setzen Sie den Parameter setFilterByAuthorizedAccounts
auf true
. Wenn keine Anmeldedaten verfügbar sind, rufen Sie die API noch einmal auf und setzen Sie setFilterByAuthorizedAccounts
auf false
.
Wenn du Nutzer nach Möglichkeit automatisch anmelden möchtest, aktiviere die Funktion mit setAutoSelectEnabled
in deiner GetGoogleIdOption
-Anfrage. Die automatische Anmeldung ist möglich, wenn die folgenden Kriterien erfüllt sind:
- Der Nutzer hat für Ihre Anwendung genau ein Ausweisdokument gespeichert, also ein gespeichertes Passwort oder ein Google-Konto.
- Der Nutzer hat die automatische Anmeldung nicht in den Google-Kontoeinstellungen deaktiviert.
Verwenden Sie setNonce
, um in jede Anfrage eine Nonce aufzunehmen, um die Sicherheit bei der Anmeldung zu verbessern und Angriffe auf die erneute Wiedergabe zu vermeiden.
Weitere Informationen zum Generieren einer Nonce
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();
Über Google anmelden
So richtest du einen „Über Google anmelden“-Vorgang ein:
- Instanziieren Sie das
GetCredentialRequest
und fügen Sie das oben erstelltegoogleIdOption
hinzu, um die Anmeldedaten abzurufen. - Übergeben Sie diese Anfrage an den Aufruf
getCredential()
(Kotlin) odergetCredentialAsync()
(Java), um die verfügbaren Anmeldedaten des Nutzers abzurufen. - Extrahieren Sie nach erfolgreicher API die
CustomCredential
, die das Ergebnis fürGoogleIdTokenCredential
-Daten enthält. - Der Typ von
CustomCredential
muss dem Wert vonGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
entsprechen. Konvertieren Sie das Objekt mithilfe der MethodeGoogleIdTokenCredential.createFrom
in einGoogleIdTokenCredential
-Objekt. - Wenn die Konvertierung erfolgreich ist, extrahieren Sie die ID des
GoogleIdTokenCredential
, validieren und authentifizieren Sie die Anmeldedaten auf Ihrem Server. - Wenn die Konvertierung mit einer
GoogleIdTokenParsingException
fehlschlägt, musst du möglicherweise die Version der Über Google-Bibliothek anmelden aktualisieren. - Erkennen Sie alle unbekannten benutzerdefinierten Anmeldedatentypen.
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");
}
}
Schaltfläche „Über Google anmelden“
Die Schaltfläche Über Google anmelden wird vom Anmeldedaten-Manager mit der neuesten Google ID-Hilfsbibliothek unterstützt. Wenn du den Vorgang für die Schaltfläche „Über Google anmelden“ auslösen möchtest, verwende GetSignInWithGoogleOption
anstelle von GetGoogleIdOption
und verarbeite das zurückgegebene GoogleIdTokenCredential
auf die gleiche Weise wie zuvor.
Über Google registrieren
Wenn nach dem Festlegen von setFilterByAuthorizedAccounts
auf true
bei der Instanziierung der GetGoogleIdOption
-Anfrage und der Übergabe an GetCredentialsRequest
keine Ergebnisse zurückgegeben werden, bedeutet dies, dass keine autorisierten Konten zur Anmeldung vorhanden sind. An dieser Stelle sollten Sie setFilterByAuthorizedAccounts(false)
festlegen und Über Google anmelden aufrufen.
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();
Nachdem du die Google-Registrierungsanfrage instanziiert hast , starte den Authentifizierungsvorgang ähnlich wie im Abschnitt Über Google anmelden beschrieben.
Abmeldung
Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die API-Methode clearCredentialState()
auf, um den aktuellen Status der Nutzeranmeldedaten zu löschen und den internen Anmeldestatus zurückzusetzen.