In diesem Leitfaden wird beschrieben, wie Sie „Über Google anmelden“ implementieren. Er umfasst die folgenden Schritte:
- Fügen Sie Ihrer App Abhängigkeiten hinzu.
- Instanziieren Sie
CredentialManager. - Erstellen Sie den Ablauf für die Ansicht am unteren Rand.
- Erstellen Sie den Button-Flow.
- Verarbeiten Sie die Antwort auf die Anmeldung.
- Fehler verarbeiten.
- Abmeldung verarbeiten
Abhängigkeiten zur App hinzufügen
Deklarieren Sie in der Datei build.gradle Ihres Moduls Abhängigkeiten mit der aktuellen Version von Credential Manager, Play-Dienste Auth und googleid:
Kotlin
dependencies { implementation("androidx.credentials:credentials:1.7.0-alpha02") implementation("androidx.credentials:credentials-play-services-auth:1.7.0-alpha02") implementation("com.google.android.libraries.identity.googleid:googleid:<latest version>") }
Groovy
dependencies { implementation "androidx.credentials:credentials:1.7.0-alpha02" implementation "androidx.credentials:credentials-play-services-auth:1.7.0-alpha02" implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>" }
Credential Manager instanziieren
Verwenden Sie den Kontext Ihrer App oder Aktivität, um ein CredentialManager-Objekt zu erstellen.
// 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 Managers. Diese Benutzeroberfläche bietet eine einheitliche Darstellung für alle Authentifizierungsmethoden, z. B. Passwörter, Passkeys und „Über Google anmelden“.
Anmeldeanfrage für zuvor autorisierte Konten konfigurieren
Versuche, eine Google-Anmeldeanfrage mit GetGoogleIdOption zu senden, 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 Anfrageobjekt googleIdOption ist so konfiguriert:
Zuvor autorisierte Konten filtern:Wenn Sie die autorisierten Konten abrufen möchten, die zuvor für die Anmeldung in Ihrer App verwendet wurden, setzen Sie
setFilterByAuthorizedAccountsauftrue.Der Standardwert für
setFilterByAuthorizedAccountsisttrue. Das bedeutet, dass das Standardverhalten für die Ansicht am unteren Rand nur zuvor autorisierte Konten anzeigt.Server-Client-ID festlegen:Legen Sie den Parameter
setServerClientIdfest.webClientIdist die Webclient-ID, die Sie in Ihrem Google Cloud-Projekt für OAuth 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 werden dadurch unnötige Reibungspunkte beseitigt, wenn sie bereits angemeldet waren.Die automatische Anmeldung ist nur möglich, wenn die folgenden Kriterien erfüllt sind:
- Es gibt nur ein einziges autorisiertes Konto auf dem Gerät und dieses autorisierte Konto wurde zuvor verwendet, um sich auf dem Gerät in der App anzumelden. Wenn mehrere autorisierte Konten auf dem Gerät vorhanden sind, wird die automatische Anmeldung deaktiviert.
- Der Nutzer hat sich während seiner vorherigen Sitzung nicht explizit von der App abgemeldet.
- Der Nutzer hat die automatische Anmeldung in seinen Google-Kontoeinstellungen nicht deaktiviert.
Nonce festlegen (optional): Wenn Sie die erweiterte Sicherheit aktivieren möchten, legen Sie eine Nonce für die serverseitige Überprüfung fest. Um Replay-Angriffe zu verhindern, können Sie eine Nonce für die serverseitige Überprüfung mit
setNonce()einfügen. Achten Sie darauf, dass Ihr serverseitiger Code prüft, ob die Nonces der Anfrage und der Antwort identisch sind.Verwenden Sie zum Generieren der Nonce eine Funktion, die der folgenden ähnelt. Sie generiert eine kryptografisch starke Zufalls-Nonce 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üfe mit der Methode getCredential, ob der Nutzer ein autorisiertes Konto auf dem Gerät hat:
val request: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
// Use an activity-based context to avoid undefined system UI
// launching behavior.
val mutableContext = MutableContextWrapper(activityContext)
coroutineScope {
try {
val result = credentialManager.getCredential(
request = request,
context = mutableContext // Use MutableContextWrapper to avoid memory leak during configuration changes
)
handleSignIn(result)
} catch (e: GetCredentialException) {
// Handle failures
}
}
Anmeldeanfrage konfigurieren, wenn keine autorisierten Konten verfügbar sind
Wenn es auf dem Gerät keine autorisierten Nutzer für Ihre App gibt, gibt CredentialManager den Wert NoCredentialException zurück. In diesem Szenario sollten Sie den Filter für autorisierte Konten deaktivieren, damit sich der Nutzer mit einem anderen Konto registrieren kann.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(WEB_CLIENT_ID)
.setNonce(generateSecureRandomNonce())
.build()
Fordern Sie als Nächstes die Anmeldung an, ähnlich wie bei autorisierten Konten.
Button-Flow erstellen
Verwenden Sie einen Button, wenn Nutzer sich unter den folgenden Bedingungen mit „Über Google anmelden“ anmelden können sollen:
- Der Nutzer hat die Ansicht am unteren Rand des Credential Managers geschlossen.
- Auf dem Gerät sind keine Google-Konten vorhanden.
- Die vorhandenen Konten auf dem Gerät müssen noch einmal authentifiziert werden.
Button-UI erstellen
Dies ist zwar mit einem Jetpack Compose-Button 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 eine Google-Anmeldeanfrage mit GetSignInWithGoogleOption, um ein Google-ID-Token abzurufen.
val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
serverClientId = WEB_CLIENT_ID
).setNonce(generateSecureRandomNonce())
.build()
Fordern Sie als Nächstes die Anmeldung an, ähnlich wie bei der Ansicht am unteren Rand.
Gemeinsame Anmeldefunktion für die Ansicht am unteren Rand und die Schaltfläche erstellen
Führe die folgenden Schritte aus, um die Anmeldung zu verarbeiten:
- Verwenden Sie die Funktion
getCredential()von CredentialManager. Wenn die Antwort erfolgreich ist, extrahieren Sie dieCustomCredential, die vom TypGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIALsein sollte. Konvertieren Sie das Objekt mit der Methode
GoogleIdTokenCredential.createFrom()in einGoogleIdTokenCredential.Validieren Sie die Anmeldedaten auf dem Server der vertrauenden Seite.
Achten Sie darauf, Fehler angemessen zu 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 verarbeiten
Sehen Sie sich die Fehler unter Fehlerbehebung an, um sicherzustellen, dass Ihr Code alle möglichen Fehlerszenarien abdeckt.
Abmeldung verarbeiten
Es ist wichtig, dass du deinen Nutzern die Möglichkeit gibst, sich von deiner App abzumelden. Ein Nutzer kann beispielsweise mehrere Google-Konten auf dem Gerät haben und sich mit einem anderen Konto anmelden wollen. Sie können diese beispielsweise auf der Seite „Einstellungen“ angeben.
Ein Anbieter von Anmeldedaten kann eine aktive Anmeldedatensitzung speichern und sie verwenden, um die Anmeldeoptionen für zukünftige Anmeldeanfragen einzuschränken. Beispielsweise kann 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 Status der Nutzeranmeldedaten bei allen Anbietern von Anmeldedaten zu löschen.
Dadurch werden alle Anbieter von Anmeldedaten darüber informiert, dass alle gespeicherten Anmeldedatensitzungen für die jeweilige App gelöscht werden sollen. So stehen Nutzern beim nächsten Mal alle Anmeldeoptionen zur Verfügung.