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 đăng nhập đã lưu trữ cho người dùng của mình.

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 phiên bản của CredentialsClient để truy cập vào Credentials API:

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 đăng nhập. Xây dựng CredentialRequest bằng phương thức setPasswordLoginSupported cho đăng nhập bằng mật khẩu và phương thức setAccountTypes() để liên kết các dịch vụ đăng nhập 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 định nghĩa trong IdentityProviders để chỉ định các nhà cung cấp dịch vụ đăng nhập thường dùng. Đối với các nhà cung cấp dịch vụ đăng nhập khác, hãy sử dụng xác định duy nhất nhà cung cấp. Bạn phải sử dụng cùng một mã nhận dạng nhà cung cấp để lưu trữ thông tin xác thực khi bạn sử dụng để truy xuất thông tin xác thực.

Yêu cầu thông tin đăng nhập đã lưu trữ

Sau khi bạn tạo các đối tượng CredentialsClientCredentialRequest, hãy truyền đối tượng yêu cầu vào 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 hàm addOnCompleteListener().

Xử lý thành công các yêu cầu về thông tin đăng nhập

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

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 hoạt động đầu vào của người dùng được yêu cầu để chọn một thông tin đăng nhập, tác vụ request() sẽ không thành công với ResolvableApiException. Kiểm tra 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 đăng nhập đã chọn của người dùng từ phương thức onActivityResult() của hoạt động bằng cách truyề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, người dùng phải tạo tài khoản hoặc tạo theo cách thủ công đăng nhập. 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 đã sử dụng gần đây, chẳng hạn như địa chỉ email và và tự động điền thông tin đó vào một số trường của biểu mẫu. 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 đăng nhập của họ để tự động hoá quy trình xác thực sau này trên tất cả các thiết bị của họ.