Bir kullanıcının depolanan kimlik bilgilerini alma

Kullanıcılarınız için depolanan kimlik bilgilerini istemek ve almak üzere Credentials API'yi kullanarak uygulamanızda otomatik olarak oturum açmalarını sağlayın.

Başlamadan önce

Bir Android Studio projesi yapılandırın.

CredentialsClient nesnesi oluşturma

Depolanan kimlik bilgilerini istemek için Credentials API'ye erişmek üzere CredentialsClient örneği oluşturmanız gerekir:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

CredentialRequest nesnesi oluşturma

CredentialRequest nesnesi, kimlik bilgilerini istemek istediğiniz oturum açma sistemlerini belirtir. Şifre tabanlı oturum açma için setPasswordLoginSupported yöntemini ve Google ile Oturum Açma gibi birleşik oturum açma hizmetleri için setAccountTypes() yöntemini kullanarak bir CredentialRequest oluşturun.

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

Yaygın olarak kullanılan oturum açma sağlayıcılarını belirtmek için IdentityProviders içinde tanımlanan sabit değerleri kullanın. Diğer oturum açma sağlayıcıları için sağlayıcıyı benzersiz şekilde tanımlayan herhangi bir dize kullanın. Kimlik bilgilerini depolamak için kimlik bilgilerini alırken kullandığınız sağlayıcı tanımlayıcısını kullanmanız gerekir.

Depolanan kimlik bilgilerini iste

CredentialsClient ve CredentialRequest nesnelerini oluşturduktan sonra, uygulamanız için depolanan kimlik bilgilerini istemek amacıyla istek nesnesini CredentialsClient.request() yöntemine iletin.

  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"
              // ...
          }
      });

addOnCompleteListener() yöntemini kullanarak başarılı ve başarısız istekleri işlemek için bir geri çağırma tanımlayın.

Başarılı kimlik bilgisi isteklerini işleme

Oturum açma işleminin başarılı olduğunu gösteren kısa mesaj Başarılı bir kimlik bilgisi isteğinde, kullanıcının uygulamanızda oturum açma işlemini tamamlamak için sonuçta ortaya çıkan Credential nesnesini kullanın. Alınan kimlik bilgilerinin türünü belirlemek için getAccountType() yöntemini kullanın, ardından uygun oturum açma işlemini tamamlayın. Örneğin, Google ile Oturum Açma için, kullanıcı kimliğini içeren bir GoogleSignInClient nesnesi oluşturun, ardından bu nesneyi oturum açma akışını başlatmak için kullanın. Şifre tabanlı oturum açmak için Kimlik Bilgisi nesnesindeki kullanıcı kimliğini ve şifresini kullanarak uygulamanızın oturum açma işlemini tamamlayın.

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();
        // ...
    }
}

Birden fazla kayıtlı kimlik bilgisini işleyin

Smart Lock hesap seçici

Kimlik bilgisi seçmek için kullanıcı girişi gerektiğinde request() görevi ResolvableApiException ile başarısız olur. getStatusCode() işlevinin RESOLUTION_REQUIRED değerini döndürdüğünden emin olun ve kullanıcıdan hesap seçmesini istemek için istisnanın startResolutionForResult() yöntemini çağırın. Ardından Credential.EXTRA_KEY öğesini getParcelableExtra() yöntemine geçirerek etkinliğin onActivityResult() yönteminden kullanıcının seçtiği kimlik bilgilerini alın.

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();
        }
    }

    // ...

}

Depolanan kimlik bilgileri bulunamadığında kullanıcıların hesap oluşturması veya manuel olarak oturum açması gerekir. getStatusCode() SIGN_IN_REQUIRED değerini döndürürse isteğe bağlı olarak kullanıcıdan e-posta adresi ve ad gibi son kullanılan oturum açma bilgilerini seçmesini isteyerek ve formdaki bazı alanları bu bilgilerle otomatik olarak doldurarak kayıt ve oturum açma işlemlerini hızlandırabilirsiniz. Ayrıntılar için Kullanıcıya oturum açma ipuçları sağlama sayfasına göz atın.

Başarılı bir şekilde oturum açıldığında, kullanıcıların tüm cihazlarında gelecekteki kimlik doğrulamasını otomatikleştirmek için kimlik bilgilerini kaydetmesine izin verin.