„Über Google anmelden“ implementieren

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
  • CredentialManager instanziieren
  • 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 setFilterByAuthorizedAccounts auf true.

    Der Standardwert für setFilterByAuthorizedAccounts ist true. 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 setServerClientId fest. Die webClientId ist 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) und setFilterByAuthorizedAccounts(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:

  1. Verwenden Sie die Funktion getCredential() von CredentialManager. Wenn die Antwort erfolgreich ist, extrahieren Sie die CustomCredential. Sie sollte vom Typ GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL sein.
  2. Konvertieren Sie das Objekt mit der GoogleIdTokenCredential.createFrom() Methode in ein GoogleIdTokenCredential.

  3. Validieren Sie die Anmeldedaten auf dem Server der vertrauenden Seite.

  4. 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.