In diesem Leitfaden wird beschrieben, wie Sie „Über Google anmelden“ implementieren. Außerdem werden die folgenden Schritte behandelt:
- Abhängigkeiten zu Ihrer App hinzufügen
CredentialManagerinstanziieren- Ablauf für die Ansicht am unteren Rand erstellen
- Ablauf für die Schaltfläche erstellen
- Anmeldung beantworten
- Fehler behandeln
- Abmeldung behandeln
Abhängigkeiten zu Ihrer App hinzufügen
Deklarieren Sie in der build.gradle-Datei 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-alpha01") implementation("androidx.credentials:credentials-play-services-auth:1.7.0-alpha01") implementation("com.google.android.libraries.identity.googleid:googleid:<latest version>") }
Groovy
dependencies { implementation "androidx.credentials:credentials:1.7.0-alpha01" implementation "androidx.credentials:credentials-play-services-auth:1.7.0-alpha01" implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>" }
Credential Manager instanziieren
Verwenden Sie den App- oder Aktivitätskontext, 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 von Credential Manager. Mit dieser Benutzeroberfläche wird eine einheitliche Nutzererfahrung für alle Authentifizierungsmethoden geschaffen, z. B. für Passwörter, Passkeys und „Über Google anmelden“.
Anmeldeanfrage für zuvor autorisierte Konten konfigurieren
Versuchen Sie eine Google-Anmeldeanfrage 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 wird 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 standardmäßig nur zuvor autorisierte Konten in der Benutzeroberfläche der Ansicht am unteren Rand angezeigt werden.Server-Client-ID festlegen:Legen Sie den Parameter
setServerClientIdfest. DiewebClientIdist die Web-Client-ID, die Sie für OAuth in Ihrem Google Cloud Project 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 so unnötige Hürden vermieden, wenn sie sich bereits zuvor angemeldet haben.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. Mehrere autorisierte Konten auf dem Gerät deaktivieren die automatische Anmeldung.
- 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 erweiterte Sicherheitsfunktionen aktivieren möchten, legen Sie eine Nonce für die serverseitige Überprüfung fest. Um Replay-Angriffe zu verhindern, können Sie mit
setNonce()eine Nonce für die serverseitige Überprüfung einfügen. Achten Sie darauf, dass Ihr serverseitiger Code prüft, ob die Nonces für Anfrage und Antwort identisch sind.Verwenden Sie eine Funktion wie die folgende, um die Nonce zu generieren. Sie generiert eine kryptografisch starke zufällige 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ü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 eine NoCredentialException zurück. Deaktivieren Sie in diesem Fall den Filter für autorisierte Konten, damit sich der Nutzer mit einem anderen Konto anmelden 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.
Flow für die Schaltfläche erstellen
Verwenden Sie eine Schaltfläche, wenn Nutzer sich unter den folgenden Bedingungen über „Über Google anmelden“ anmelden sollen:
- Der Nutzer hat die Benutzeroberfläche der Ansicht am unteren Rand von 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.
Benutzeroberfläche für die Schaltfläche erstellen
Sie können zwar eine Jetpack Compose-Schaltfläche verwenden, aber auch ein vorab genehmigtes Markensymbol von der Seite Branding-Richtlinien für „Über Google anmelden“.
Anmeldeablauf 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 Benutzeroberfläche der Ansicht am unteren Rand.
Gemeinsame Anmeldefunktion für die Ansicht am unteren Rand und die Schaltfläche 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 Sie dieCustomCredential. Sie sollte vom TypGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIALsein. Konvertieren Sie das Objekt mit der
GoogleIdTokenCredential.createFrom()Methode in einGoogleIdTokenCredential.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 behandelt.
Abmeldung behandeln
Es ist wichtig, dass Ihre Nutzer sich von Ihrer App abmelden können. Ein Nutzer hat beispielsweise möglicherweise mehrere Google-Konten auf dem Gerät und entscheidet sich, sich mit einem anderen Konto anzumelden. Sie können diese Option beispielsweise auf der Seite „Einstellungen“ anbieten.
Ein Anmeldedatenanbieter kann eine aktive Anmeldedatensitzung speichern und damit die Anmeldeoptionen für zukünftige Anmeldeanfragen einschränken. Er kann beispielsweise die aktiven Anmeldedaten gegenüber allen anderen verfügbaren Anmeldedaten priorisieren.
Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die API clearCredentialState()
Methode auf, um den aktuellen Anmeldedatenstatus des Nutzers von allen Anmeldedatenanbietern zu löschen.
So werden alle Anmeldedatenanbieter benachrichtigt, dass alle gespeicherten Anmeldedatensitzungen für die jeweilige App gelöscht werden sollen. Nutzer haben dann beim nächsten Mal alle Anmeldeoptionen zur Verfügung.