Truy xuất thông tin xác thực đã lưu trữ của người dùng

Tự động đăng nhập người dùng vào ứng dụng của bạn bằng cách sử dụng API thông tin xác thực để yêu cầu và truy xuất thông tin xác thực đã lưu trữ cho người dùng.

Trước khi bắt đầu

Định cấu hình dự án Android Studio.

Tạo đối tượng CredentialsClient

Để yêu cầu thông tin xác thực đã lưu trữ, bạn phải tạo một bản sao của CredentialsClient để truy cập vào API thông tin xác thực:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Tạo đối tượng CredentialRequest

Đối tượng CredentialRequest chỉ định hệ thống đăng nhập mà bạn muốn yêu cầu thông tin xác thực. Tạo CredentialRequest bằng phương thức setPasswordLoginSupported để đăng nhập dựa trên mật khẩu và phương thức setAccountTypes() cho các dịch vụ đăng nhập liên kết như Đăng nhập bằng Google.

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

Sử dụng các hằng số được xác định trong IdentityProviders để chỉ định trình cung cấp dịch vụ đăng nhập thường dùng. Đối với các trình cung cấp dịch vụ đăng nhập khác, hãy sử dụng bất kỳ chuỗi nào xác định duy nhất trình cung cấp. Bạn phải sử dụng cùng một giá trị nhận dạng nhà cung cấp để lưu trữ thông tin xác thực như bạn dùng để truy xuất thông tin xác thực.

Yêu cầu thông tin xác thực đã lưu trữ

Sau khi bạn tạo đối tượng CredentialsClientCredentialRequest, hãy truyền đối tượng yêu cầu đó đến phương thức CredentialsClient.request() để yêu cầu thông tin xác thực được lưu trữ cho ứng dụng của bạn.

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

Xác định lệnh gọi lại để xử lý các yêu cầu thành công và không thành công bằng phương thức addOnCompleteListener().

Xử lý các yêu cầu thông tin xác thực thành công

Thông báo ngắn cho biết đăng nhập thành côngTrong một yêu cầu thông tin xác thực thành công, hãy sử dụng đối tượng Credential kết quả để hoàn tất quá trình đăng nhập của người dùng vào ứng dụng. Hãy sử dụng phương thức getAccountType() để xác định loại thông tin xác thực đã truy xuất, sau đó hoàn tất quy trình đăng nhập thích hợp. Ví dụ: đối với tính năng Đăng nhập bằng Google, hãy tạo đối tượng GoogleSignInClient có chứa mã nhận dạng của người dùng, sau đó sử dụng đối tượng này để bắt đầu quy trình đăng nhập. Đối với hoạt động đăng nhập bằng mật khẩu, hãy sử dụng mã nhận dạng và mật khẩu của người dùng trong Đối tượng thông tin xác thực để hoàn tất quá trình đăng nhập vào ứng dụng.

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

Xử lý nhiều thông tin đăng nhập đã lưu

Trình chọn tài khoản Smart Lock

Khi cần có dữ liệu đầu vào của người dùng để chọn thông tin xác thực, tác vụ request() sẽ không thành công với ResolvableApiException. Hãy kiểm tra để đảm bảo rằng getStatusCode() trả về RESOLUTION_REQUIRED và gọi phương thức startResolutionForResult() của ngoại lệ để nhắc người dùng chọn một tài khoản. Sau đó, truy xuất thông tin xác thực đã chọn của người dùng từ phương thức onActivityResult() của hoạt động bằng cách chuyển Credential.EXTRA_KEY vào phương thức 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();
        }
    }

    // ...

}

Khi không tìm thấy thông tin đăng nhập đã lưu trữ, người dùng phải tạo một tài khoản hoặc đăng nhập theo cách thủ công. Nếu getStatusCode() trả về SIGN_IN_REQUIRED, bạn có thể tuỳ ý đẩy nhanh quá trình đăng ký và đăng nhập bằng cách nhắc người dùng chọn thông tin đăng nhập được sử dụng gần đây, chẳng hạn như địa chỉ email và tên, đồng thời tự động điền thông tin đó vào một số trường của biểu mẫu. Hãy xem phần Cung cấp gợi ý đăng nhập cho người dùng để biết thông tin chi tiết.

Khi đăng nhập thành công, hãy cho phép người dùng lưu thông tin xác thực của họ để tự động hoá quá trình xác thực trong tương lai trên tất cả thiết bị của họ.