In diesem Leitfaden wird beschrieben, wie Sie „Mit Google anmelden“ implementieren. Er umfasst die folgenden Schritte:
- Fügen Sie Ihrer App Abhängigkeiten hinzu.
- Instanziieren Sie
CredentialManager. - Ansicht am unteren Rand erstellen
- Erstellen Sie den Schaltflächenablauf.
- Anmeldeantwort verarbeiten
- Fehler behandeln.
- Abmeldung verarbeiten
Abhängigkeiten zur App hinzufügen
Deklarieren Sie in der Datei build.gradle Ihres Moduls Abhängigkeiten mit der neuesten Version von Credential Manager, Play Services Auth und googleid:
Kotlin
dependencies { implementation("androidx.credentials:credentials:1.6.0-rc02") implementation("androidx.credentials:credentials-play-services-auth:1.6.0-rc02") implementation("com.google.android.libraries.identity.googleid:googleid:<latest version>") }
Groovy
dependencies { implementation "androidx.credentials:credentials:1.6.0-rc02" implementation "androidx.credentials:credentials-play-services-auth:1.6.0-rc02" implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>" }
Credential Manager instanziieren
Erstellen Sie ein CredentialManager-Objekt mit Ihrer App oder Ihrem Aktivitätskontext.
// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)
Ablauf für die Ansicht am unteren Rand erstellen
Die Ansicht am unteren Rand ist die integrierte Benutzeroberfläche des Credential Manager. Diese Benutzeroberfläche sorgt für eine einheitliche Nutzererfahrung bei allen Authentifizierungsmethoden, z. B. Passwörtern, Passkeys und „Mit Google anmelden“.
Anmeldeanfrage für zuvor autorisierte Konten konfigurieren
Senden Sie eine Google Log-in-Anfrage mit GetGoogleIdOption, um das Google-ID-Token des Nutzers abzurufen.
Mit den folgenden Snippets wird geprüft, ob das Konto ein autorisiertes Konto ist.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
.setNonce(generateSecureRandomNonce())
.build()
Das googleIdOption-Objekt der Anfrage ist so konfiguriert:
Zuvor autorisierte Konten filtern:Wenn Sie die autorisierten Konten abrufen möchten, die zuvor zum Anmelden in Ihrer App verwendet wurden, legen Sie
setFilterByAuthorizedAccountsauftruefest.Der Standardwert für
setFilterByAuthorizedAccountsisttrue. Das bedeutet, dass in der Bottom Sheet-Benutzeroberfläche standardmäßig nur zuvor autorisierte Konten angezeigt werden.Server-Client-ID festlegen:Legen Sie den Parameter
setServerClientIdfest. DiewebClientIdist die Webclient-ID, die Sie für OAuth in Ihrem Google Cloud-Projekt eingerichtet haben, als Sie die Voraussetzungen erfüllt haben.Automatische Anmeldung aktivieren (optional): Wenn Sie die automatische Anmeldung für wiederkehrende Nutzer aktivieren möchten, verwenden Sie
setAutoSelectEnabled(true)undsetFilterByAuthorizedAccounts(true). Für Ihre App-Nutzer wird dadurch die Anmeldung vereinfacht, wenn sie bereits angemeldet waren.Die automatische Anmeldung ist nur möglich, wenn die folgenden Kriterien erfüllt sind:
- Auf dem Gerät ist nur ein autorisiertes Konto vorhanden und dieses autorisierte Konto wurde zuvor verwendet, um sich auf dem Gerät in der App anzumelden. Wenn auf dem Gerät mehrere autorisierte Konten vorhanden sind, wird die automatische Anmeldung deaktiviert.
- Der Nutzer hat sich in der vorherigen Sitzung nicht explizit von der App abgemeldet.
- Der Nutzer hat die automatische Anmeldung nicht in den Einstellungen seines Google-Kontos deaktiviert.
Nonce festlegen (optional): Wenn Sie die Sicherheit erhöhen möchten, legen Sie eine Nonce für die serverseitige Bestätigung fest. Um Replay-Angriffe zu verhindern, können Sie für die serverseitige Bestätigung mit
setNonce()eine Nonce einfügen. Achten Sie darauf, dass in Ihrem serverseitigen Code geprüft wird, ob die Anfrage- und Antwort-Nonces identisch sind.Verwenden Sie zum Generieren der Nonce eine Funktion, die der folgenden ähnelt. Sie generiert eine kryptografisch starke zufällige Nonce mit einer bestimmten Länge und codiert sie mit
Base64:
fun generateSecureRandomNonce(byteLength: Int = 32): String {
val randomBytes = ByteArray(byteLength)
SecureRandom().nextBytes(randomBytes)
return Base64.encodeToString(randomBytes, Base64.NO_WRAP or Base64.URL_SAFE or Base64.NO_PADDING)
}
Anmeldung anfordern
Prüfen Sie mit der Methode getCredential, ob der Nutzer ein autorisiertes Konto auf dem Gerät hat:
val request: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
coroutineScope {
try {
val result = credentialManager.getCredential(
request = request,
context = activityContext,
)
handleSignIn(result)
} catch (e: GetCredentialException) {
// Handle failures
}
}
Anmeldeanfrage konfigurieren, wenn keine autorisierten Konten verfügbar sind
Wenn auf dem Gerät keine autorisierten Nutzer für Ihre App vorhanden sind, gibt CredentialManager ein NoCredentialException zurück. Deaktivieren Sie in diesem Fall den Filter für autorisierte Konten, damit sich der Nutzer mit einem anderen Konto registrieren kann.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(WEB_CLIENT_ID)
.setNonce(generateSecureRandomNonce())
.build()
Als Nächstes fordern Sie die Anmeldung an, ähnlich wie bei autorisierten Konten.
Schaltflächenfluss erstellen
Verwenden Sie eine Schaltfläche, wenn Nutzer sich unter den folgenden Bedingungen mit „Über Google anmelden“ anmelden sollen:
- Der Nutzer hat die Bottom-Sheet-Benutzeroberfläche des Credential Manager geschlossen.
- Auf dem Gerät sind keine Google-Konten vorhanden.
- Die vorhandenen Konten auf dem Gerät müssen noch einmal authentifiziert werden.
Schaltflächen-UI erstellen
Das ist zwar mit einer Jetpack Compose-Schaltfläche möglich, Sie können aber auch ein vorab genehmigtes Markensymbol von der Seite Branding-Richtlinien für „Über Google anmelden“ verwenden.
Anmeldevorgang erstellen
Erstellen Sie mit GetSignInWithGoogleOption eine Google Log-in-Anfrage, um ein Google-ID-Token abzurufen.
val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
serverClientId = WEB_CLIENT_ID
).setNonce(generateSecureRandomNonce())
.build()
Als Nächstes fordern Sie die Anmeldung an, ähnlich wie bei der Bottom Sheet-Benutzeroberfläche.
Funktion für die gemeinsame Anmeldung für die Ansicht am unteren Rand und den Button erstellen
Führen Sie die folgenden Schritte aus, um die Anmeldung zu verarbeiten:
- Verwenden Sie die Funktion
getCredential()von CredentialManager. Wenn die Antwort erfolgreich ist, extrahieren SieCustomCredential, das vom TypGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIALsein sollte. Wandeln Sie das Objekt mit der Methode
GoogleIdTokenCredential.createFrom()in einGoogleIdTokenCredentialum.Validieren Sie die Anmeldedaten auf dem Server der vertrauenden Seite.
Achten Sie darauf, dass Sie Fehler angemessen behandeln.
fun handleSign(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 the ID for server-side validation.
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")
}
}
}
Fehler behandeln
Sehen Sie sich die unter Fehlerbehebung aufgeführten Fehler an, um sicherzustellen, dass Ihr Code alle möglichen Fehlerszenarien abdeckt.
Abmeldung verarbeiten
Es ist wichtig, dass Sie Ihren Nutzern die Möglichkeit geben, sich aus Ihrer App abzumelden. Ein Nutzer hat beispielsweise möglicherweise mehrere Google-Konten auf dem Gerät und möchte sich mit einem anderen Konto anmelden. Sie können diese beispielsweise auf der Seite „Einstellungen“ angeben.
Ein Anmeldedatenanbieter kann eine aktive Anmeldedatensitzung speichern und damit die Anmeldeoptionen für zukünftige Anmeldeanfragen einschränken. So kann beispielsweise der aktive Berechtigungsnachweis gegenüber allen anderen verfügbaren Berechtigungsnachweisen priorisiert werden.
Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die API-Methode clearCredentialState() auf, um den aktuellen Anmeldedatenstatus des Nutzers bei allen Anmeldedatenanbietern zu löschen.
Dadurch werden alle Anmeldedienstanbieter benachrichtigt, dass alle gespeicherten Anmeldedaten für die angegebene App gelöscht werden sollen. Nutzern stehen dann beim nächsten Mal wieder alle Anmeldeoptionen zur Verfügung.