Anmeldedaten-Manager in „Über Google anmelden“ einbinden

Ansicht am unteren Rand mit aktiviertem Anmeldedaten-Manager mit verschiedenen Identitäten zur Auswahl.
Abbildung 1: Das Dialogfeld „Über Google anmelden“ am unteren Rand wird nach der Integration mit der Credential Manager API angezeigt.

In diesem Dokument wird erläutert, wie Sie das Dialogfeld „Über Google anmelden“ am unteren Rand von Google Identity Services (GIS) mithilfe der Hilfsbibliothek Google ID zur Credentials Manager API migrieren.

Eine App, die die Credential Manager API verwendet, ist so konfiguriert, dass dem Endnutzer eine konsistente Android-Benutzeroberfläche angezeigt wird, über die der Nutzer aus einer Liste mit gespeicherten Anmeldeoptionen auswählen kann, einschließlich Konten mit aktiviertem Passkey. Dies ist die empfohlene Android API zum Konsolidieren verschiedener Arten und Anbieter von Anmeldedaten. Ab Android 14 können Nutzer auch Passwortmanager von Drittanbietern mit der Credential Manager API verwenden.

Abhängigkeiten deklarieren

Deklarieren Sie in der Datei build.gradle Ihres Moduls Abhängigkeiten mithilfe der neuesten Version:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Folgen Sie dieser Anleitung, um Ihr Google API Console-Projekt einzurichten. Ersetzen Sie die Anleitung zum Einbeziehen von Abhängigkeiten durch die oben genannte Anleitung.

Google Log-in-Anfrage instanziieren

Instanziieren Sie zuerst eine Google Log-in-Anfrage, um mit der Implementierung zu beginnen. Verwenden Sie GetGoogleIdOption, um das Google-ID-Token eines Nutzers abzurufen.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Rufen Sie zuerst die API auf und setzen Sie den Parameter setFilterByAuthorizedAccounts auf true. Wenn keine Anmeldedaten verfügbar sind, rufen Sie die API noch einmal auf und setzen Sie setFilterByAuthorizedAccounts auf false.

Wenn du Nutzer nach Möglichkeit automatisch anmelden möchtest, aktiviere die Funktion mit setAutoSelectEnabled in deiner GetGoogleIdOption-Anfrage. Die automatische Anmeldung ist möglich, wenn die folgenden Kriterien erfüllt sind:

  • Der Nutzer hat für Ihre Anwendung genau ein Ausweisdokument gespeichert, also ein gespeichertes Passwort oder ein Google-Konto.
  • Der Nutzer hat die automatische Anmeldung nicht in den Google-Kontoeinstellungen deaktiviert.

Verwenden Sie setNonce, um in jede Anfrage eine Nonce aufzunehmen, um die Sicherheit bei der Anmeldung zu verbessern und Angriffe auf die erneute Wiedergabe zu vermeiden. Weitere Informationen zum Generieren einer Nonce

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>);
  .build();

Über Google anmelden

So richtest du einen „Über Google anmelden“-Vorgang ein:

  1. Instanziieren Sie das GetCredentialRequest und fügen Sie das oben erstellte googleIdOption hinzu, um die Anmeldedaten abzurufen.
  2. Übergeben Sie diese Anfrage an den Aufruf getCredential() (Kotlin) oder getCredentialAsync() (Java), um die verfügbaren Anmeldedaten des Nutzers abzurufen.
  3. Extrahieren Sie nach erfolgreicher API die CustomCredential, die das Ergebnis für GoogleIdTokenCredential-Daten enthält.
  4. Der Typ von CustomCredential muss dem Wert von GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL entsprechen. Konvertieren Sie das Objekt mithilfe der Methode GoogleIdTokenCredential.createFrom in ein GoogleIdTokenCredential-Objekt.
  5. Wenn die Konvertierung erfolgreich ist, extrahieren Sie die ID des GoogleIdTokenCredential, validieren und authentifizieren Sie die Anmeldedaten auf Ihrem Server.
  6. Wenn die Konvertierung mit einer GoogleIdTokenParsingException fehlschlägt, musst du möglicherweise die Version der Über Google-Bibliothek anmelden aktualisieren.
  7. Erkennen Sie alle unbekannten benutzerdefinierten Anmeldedatentypen.

Kotlin

val request: GetCredentialRequest = Builder()
  .addGetCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Java

GetCredentialRequest request = new GetCredentialRequest.Builder()
  .addGetCredentialOption(googleIdOption)
  .build();

// Launch sign in flow and do getCredential Request to retrieve the credentials
credentialManager.getCredentialAsync(
  requireActivity(),
  request,
  cancellationSignal,
  <executor>,
  new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
    @Override
    public void onResult(GetCredentialResponse result) {
      handleSignIn(result);
    }

    @Override
    public void onError(GetCredentialException e) {
      handleFailure(e);
    }
  }
);

public void handleSignIn(GetCredentialResponse result) {
  // Handle the successfully returned credential.
  Credential credential = result.getCredential();

  if (credential instanceof PublicKeyCredential) {
    String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();
    // Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate
  } else if (credential instanceof PasswordCredential) {
    String username = ((PasswordCredential) credential).getId();
    String password = ((PasswordCredential) credential).getPassword();
    // Use id and password to send to your server to validate and authenticate
  } else if (credential instanceof CustomCredential) {
    if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
      try {
        // Use googleIdTokenCredential and extract id to validate and
        // authenticate on your server
        GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
      } catch (GoogleIdTokenParsingException e) {
        Log.e(TAG, "Received an invalid Google ID token response", e);
      }
    } else {
      // Catch any unrecognized custom credential type here.
      Log.e(TAG, "Unexpected type of credential");
    }
  } else {
    // Catch any unrecognized credential type here.
    Log.e(TAG, "Unexpected type of credential");
  }
}

Schaltfläche „Über Google anmelden“

Die Schaltfläche Über Google anmelden wird vom Anmeldedaten-Manager mit der neuesten Google ID-Hilfsbibliothek unterstützt. Wenn du den Vorgang für die Schaltfläche „Über Google anmelden“ auslösen möchtest, verwende GetSignInWithGoogleOption anstelle von GetGoogleIdOption und verarbeite das zurückgegebene GoogleIdTokenCredential auf die gleiche Weise wie zuvor.

Über Google registrieren

Wenn nach dem Festlegen von setFilterByAuthorizedAccounts auf true bei der Instanziierung der GetGoogleIdOption-Anfrage und der Übergabe an GetCredentialsRequest keine Ergebnisse zurückgegeben werden, bedeutet dies, dass keine autorisierten Konten zur Anmeldung vorhanden sind. An dieser Stelle sollten Sie setFilterByAuthorizedAccounts(false) festlegen und Über Google anmelden aufrufen.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Nachdem du die Google-Registrierungsanfrage instanziiert hast , starte den Authentifizierungsvorgang ähnlich wie im Abschnitt Über Google anmelden beschrieben.

Abmeldung

Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die API-Methode clearCredentialState() auf, um den aktuellen Status der Nutzeranmeldedaten zu löschen und den internen Anmeldestatus zurückzusetzen.