„Über Google anmelden“ implementieren

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 setFilterByAuthorizedAccounts auf true fest.

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

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

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