Gespeicherte Anmeldedaten eines Nutzers abrufen

Melden Sie Nutzer automatisch bei Ihrer Anwendung an, indem Sie mithilfe der Credentials API gespeicherte Anmeldedaten für Ihre Nutzer anfordern und abrufen.

Hinweis

Android Studio-Projekt konfigurieren

CredentialsClient-Objekt erstellen

Wenn Sie gespeicherte Anmeldedaten anfordern möchten, müssen Sie eine Instanz von CredentialsClient erstellen, um auf die Credentials API zuzugreifen:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

CredentialRequest-Objekt erstellen

Ein CredentialRequest-Objekt gibt die Anmeldesysteme an, von denen Sie Anmeldedaten anfordern möchten. Erstellen Sie eine CredentialRequest mit der Methode setPasswordLoginSupported für die passwortbasierte Anmeldung und der Methode setAccountTypes() für föderierte Anmeldedienste wie Google Log-in.

mCredentialRequest = new CredentialRequest.Builder()
    .setPasswordLoginSupported(true)
    .setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
    .build();

Verwenden Sie die in IdentityProviders definierten Konstanten, um gängige Anmeldeanbieter anzugeben. Verwenden Sie für andere Anmeldeanbieter einen beliebigen String, der den Anbieter eindeutig identifiziert. Sie müssen zum Speichern von Anmeldedaten dieselbe Anbieter-ID verwenden wie zum Abrufen der Anmeldedaten.

Gespeicherte Anmeldedaten anfordern

Nachdem Sie die Objekte CredentialsClient und CredentialRequest erstellt haben, übergeben Sie das Anfrageobjekt an die Methode CredentialsClient.request(), um für Ihre Anwendung gespeicherte Anmeldedaten anzufordern.

  mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
      new OnCompleteListener<CredentialRequestResponse>() {
          @Override
          public void onComplete(@NonNull Task<CredentialRequestResponse> task) {

              if (task.isSuccessful()) {
                  // See "Handle successful credential requests"
                  onCredentialRetrieved(task.getResult().getCredential());
                  return;
              }

              // See "Handle unsuccessful and incomplete credential requests"
              // ...
          }
      });

Definieren Sie einen Callback, um erfolgreiche und fehlgeschlagene Anfragen mit der Methode addOnCompleteListener() zu verarbeiten.

Erfolgreiche Anmeldedatenanfragen verarbeiten

Toast, der auf eine erfolgreiche Anmeldung hinweist Bei einer erfolgreichen Anmeldedatenanfrage verwenden Sie das resultierende Credential-Objekt, um die Anmeldung des Nutzers bei Ihrer Anwendung abzuschließen. Verwenden Sie die Methode getAccountType(), um den Typ der abgerufenen Anmeldedaten zu ermitteln, und führen Sie dann den entsprechenden Anmeldevorgang aus. Erstelle beispielsweise für Google Log-in ein GoogleSignInClient-Objekt, das die Nutzer-ID enthält, und verwende es dann, um den Anmeldevorgang zu starten. Verwenden Sie für eine passwortbasierte Anmeldung die ID und das Passwort des Nutzers aus dem Objekt „Anmeldedaten“, um den Anmeldevorgang Ihrer Anwendung abzuschließen.

private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType == null) {
        // Sign the user in with information from the Credential.
        signInWithPassword(credential.getId(), credential.getPassword());
    } else if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();

        GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
        Task<GoogleSignInAccount> task = signInClient.silentSignIn();
        // ...
    }
}

Mehrere gespeicherte Anmeldedaten verarbeiten

Kontoauswahl für Smart Lock

Wenn eine Nutzereingabe erforderlich ist, um Anmeldedaten auszuwählen, schlägt die Aufgabe request() mit der Fehlermeldung ResolvableApiException fehl. Prüfen Sie, ob getStatusCode() RESOLUTION_REQUIRED zurückgibt, und rufen Sie die Methode startResolutionForResult() der Ausnahme auf, um den Nutzer zur Auswahl eines Kontos aufzufordern. Rufen Sie dann die ausgewählten Anmeldedaten des Nutzers aus der Methode onActivityResult() der Aktivität ab. Übergeben Sie dazu Credential.EXTRA_KEY an die Methode getParcelableExtra().

mCredentialsClient.request(request).addOnCompleteListener(
        new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull Task task) {
                if (task.isSuccessful()) {
                    // ...
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // This is most likely the case where the user has multiple saved
                    // credentials and needs to pick one. This requires showing UI to
                    // resolve the read request.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    resolveResult(rae, RC_READ);
                } else if (e instanceof ApiException) {
                    // The user must create an account or sign in manually.
                    Log.e(TAG, "Unsuccessful credential request.", e);

                    ApiException ae = (ApiException) e;
                    int code = ae.getStatusCode();
                    // ...
                }
            }
        });
private void resolveResult(ResolvableApiException rae, int requestCode) {
    try {
        rae.startResolutionForResult(MainActivity.this, requestCode);
        mIsResolving = true;
    } catch (IntentSender.SendIntentException e) {
        Log.e(TAG, "Failed to send resolution.", e);
        hideProgress();
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // ...

    if (requestCode == RC_READ) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            onCredentialRetrieved(credential);
        } else {
            Log.e(TAG, "Credential Read: NOT OK");
            Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    // ...

}

Wenn gespeicherte Anmeldedaten nicht gefunden werden, müssen Nutzer ein Konto erstellen oder sich manuell anmelden. Wenn getStatusCode() SIGN_IN_REQUIRED zurückgibt, können Sie den Registrierungs- und Anmeldevorgang beschleunigen. Dazu werden Nutzer aufgefordert, kürzlich verwendete Anmeldeinformationen wie E-Mail-Adresse und Name auszuwählen und einige Felder der Formulare automatisch mit diesen Informationen auszufüllen. Weitere Informationen findest du unter Nutzern Anmeldehinweise bereitstellen.

Erlauben Sie Nutzern nach erfolgreicher Anmeldung, ihre Anmeldedaten zu speichern, um die zukünftige Authentifizierung auf allen ihren Geräten zu automatisieren.