Lưu trữ thông tin xác thực của người dùng

Sau khi người dùng đăng nhập, tạo tài khoản hoặc thay đổi mật khẩu thành công, hãy cho phép lưu trữ thông tin đăng nhập nhằm tự động hoá quy trình xác thực sau này trong ứng dụng của bạn.

Trước khi bắt đầu

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

Lưu trữ thông tin đăng nhập

Tạo đối tượng Credential chứa thông tin đăng nhập của người dùng. Cho để cho phép người dùng lưu trữ thông tin xác thực của mình sau khi đăng nhập thành công bằng mật khẩu của họ:

Credential credential = new Credential.Builder(email)
        .setPassword(password)  // Important: only store passwords in this field.
                                // Android autofill uses this value to complete
                                // sign-in forms, so repurposing this field will
                                // likely cause errors.
        .build();

Hoặc, ví dụ: sau khi người dùng thành công đăng nhập bằng Tài khoản Google của con:

GoogleSignInAccount gsa = signInTask.getResult();
Credential credential = new Credential.Builder(gsa.getEmail())
        .setAccountType(IdentityProviders.GOOGLE)
        .setName(gsa.getDisplayName())
        .setProfilePictureUri(gsa.getPhotoUrl())
        .build();

Hộp thoại Lưu của Smart Lock

Sau đó, hãy gọi CredentialsClient.save() để lưu dữ liệu của người dùng thông tin xác thực. Nếu lệnh gọi đến CredentialsClient.save() không xuất hiện ngay lập tức thành công thì thông tin đăng nhập đó có thể là thông tin mới. Trong trường hợp đó, người dùng phải xác nhận yêu cầu lưu. Giải quyết ResolvableApiException bằng startResolutionForResult() để nhắc người dùng xác nhận.

Nếu người dùng chọn không lưu thông tin đăng nhập thì họ sẽ không được nhắc lại để lưu thông tin đăng nhập của bất kỳ tài khoản nào cho ứng dụng. Nếu bạn gọi CredentialsClient.save() sau khi người dùng đã chọn không tham gia, kết quả sẽ có mã trạng thái của CANCELED. Người dùng có thể chọn tham gia sau từ Ứng dụng Cài đặt, trong phần Smart Lock cho Mật khẩu. Người dùng phải bật lưu thông tin đăng nhập cho tất cả tài khoản được nhắc lưu thông tin đăng nhập vào lần tiếp theo.

mCredentialsClient.save(credential).addOnCompleteListener(
        new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "SAVE: OK");
                    Toast.makeText(activity, "Credentials saved", Toast.LENGTH_SHORT).show();
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // Try to resolve the save request. This will prompt the user if
                    // the credential is new.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    try {
                        rae.startResolutionForResult(this, RC_SAVE);
                    } catch (IntentSender.SendIntentException exception) {
                        // Could not resolve the request
                        Log.e(TAG, "Failed to send resolution.", exception);
                        Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    // Request has no resolution
                    Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                }
            }
        });</pre>

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // ...

        if (requestCode == RC_SAVE) {
            if (resultCode == RESULT_OK) {
                Log.d(TAG, "SAVE: OK");
                Toast.makeText(this, "Credentials saved", Toast.LENGTH_SHORT).show();
            } else {
                Log.e(TAG, "SAVE: Canceled by user");
            }
        }

        // ...

    }

Sau khi lưu trữ thông tin xác thực, hãy truy xuất thông tin xác thực bằng cách gọi CredentialsClient.request().

Nhắm mục tiêu Android O trở lên

Khi bạn lưu thông tin xác thực mật khẩu bằng Smart Lock trên các thiết bị chạy Android O hoặc mới hơn, Smart Lock sử dụng hộp thoại xác nhận tự động điền gốc thay vì bất cứ khi nào có thể. (Xin lưu ý rằng thông tin đăng nhập được lưu bằng tính năng Tự động điền bằng Google được chia sẻ hai chiều với Smart Lock cho Mật khẩu.)