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 CredentialsClient
và CredentialRequest
, 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
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
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ọ.