Trên Android 15, Trình quản lý thông tin xác thực hỗ trợ quy trình nhấn một lần để xác thực thông tin xác thực tạo và truy xuất. Trong luồng này, thông tin về thông tin xác thực đang được tạo hoặc đang được sử dụng sẽ hiển thị trực tiếp trong Lời nhắc sinh trắc học, cùng với một điểm truy cập đến các tuỳ chọn khác. Quy trình đơn giản này tạo ra quy trình tạo và truy xuất thông tin xác thực hiệu quả và hợp lý hơn.
Yêu cầu:
- Hệ thống nhận dạng sinh trắc học đã được thiết lập trên thiết bị của người dùng và người dùng cho phép vào các ứng dụng.
- Đối với quy trình đăng nhập, tính năng này chỉ được bật cho các trường hợp sử dụng một tài khoản, ngay cả khi có nhiều thông tin xác thực (chẳng hạn như khoá truy cập và mật khẩu) cho tài khoản đó.
Bật quy trình tạo khoá truy cập bằng một lần nhấn
Các bước tạo của phương thức này khớp với quy trình tạo thông tin đăng nhập hiện có
. Trong BeginCreatePublicKeyCredentialRequest
, hãy sử dụng
handleCreatePasskeyQuery()
để xử lý yêu cầu nếu yêu cầu đó là khoá truy cập.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
Trong handleCreatePasskeyQuery()
, hãy thêm BiometricPromptData
với
lớp CreateEntry
:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Trình cung cấp thông tin xác thực phải đặt thuộc tính allowedAuthenticator
một cách rõ ràng
trong thực thể BiometricPromptData
. Nếu bạn không đặt thuộc tính này, giá trị
mặc định là DEVICE_WEAK
. Đặt thuộc tính cryptoObject
(không bắt buộc) nếu cần
cho trường hợp sử dụng của bạn.
Bật quy trình đăng nhập bằng khoá truy cập một lần chạm
Tương tự như quy trình tạo khoá truy cập, bạn sẽ thực hiện theo cách thiết lập hiện tại cho
xử lý quy trình đăng nhập của người dùng. Trong BeginGetPublicKeyCredentialOption
, hãy sử dụng populatePasskeyData()
để thu thập thông tin liên quan về yêu cầu xác thực:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
Tương tự như CreateEntry
, thực thể BiometricPromptData
được đặt thành
Thực thể PublicKeyCredentialEntry
. Nếu không được đặt rõ ràng,
allowedAuthenticator
mặc định là BIOMETRIC_WEAK
.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Xử lý lựa chọn mục nhập thông tin xác thực
Trong khi xử lý lựa chọn mục nhập thông tin xác thực để tạo khoá truy cập hoặc chọn khoá truy cập trong khi đăng nhập, hãy gọi PendingIntentHandler's
retrieveProviderCreateCredentialRequest
hoặc retrieveProviderGetCredentialRequest
(nếu thích hợp). Các đối tượng trả về này chứa siêu dữ liệu cần thiết cho nhà cung cấp. Ví dụ: khi xử lý
lựa chọn mục nhập tạo khoá truy cập, hãy cập nhật mã của bạn như sau:
val createRequest = PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
if (createRequest == null) {
Log.i(TAG, "request is null")
setUpFailureResponseAndFinish("Unable to extract request from intent")
return
}
// Other logic...
val biometricPromptResult = createRequest.biometricPromptResult
// Add your logic based on what needs to be done
// after getting biometrics
if (createRequest.callingRequest is CreatePublicKeyCredentialRequest) {
val publicKeyRequest: CreatePublicKeyCredentialRequest =
createRequest.callingRequest as CreatePublicKeyCredentialRequest
if (biometricPromptResult == null) {
// Do your own authentication flow, if needed
}
else if (biometricPromptResult.isSuccessful) {
createPasskey(
publicKeyRequest.requestJson,
createRequest.callingAppInfo,
publicKeyRequest.clientDataHash,
accountId
)
} else {
val error = biometricPromptResult.authenitcationError
// Process the error
}
// Other logic...
}
Ví dụ này chứa thông tin về việc quy trình nhận dạng sinh trắc học có thành công hay không. Tệp này cũng chứa các thông tin khác về thông tin xác thực. Nếu quy trình không thành công, hãy sử dụng
mã lỗi trong biometricPromptResult.authenticationError
để đưa ra quyết định.
Các mã lỗi được trả về trong biometricPromptResult.authenticationError.errorCode
cũng chính là các mã lỗi được xác định trong thư viện androidx.biometric, chẳng hạn như androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT và các mã tương tự. Chiến lược phát hành đĩa đơn
authenticationError
cũng sẽ chứa thông báo lỗi liên quan đến
errorCode
có thể hiển thị trên giao diện người dùng.
Tương tự, trích xuất siêu dữ liệu trong retrieveProviderGetCredentialRequest
.
Kiểm tra xem luồng sinh trắc học của bạn có phải là null
không. Nếu có, hãy thiết lập hệ thống nhận dạng sinh trắc học của riêng bạn để
xác thực. Thao tác này tương tự như cách đo lường thao tác get:
val getRequest =
PendingIntentHandler.retrieveProviderGetCredentialRequest(intent)
if (getRequest == null) {
Log.i(TAG, "request is null")
setUpFailureResponseAndFinish("Unable to extract request from intent")
return
}
// Other logic...
val biometricPromptResult = getRequest.biometricPromptResult
// Add your logic based on what needs to be done
// after getting biometrics
if (biometricPromptResult == null)
{
// Do your own authentication flow, if necessary
} else if (biometricPromptResult.isSuccessful) {
Log.i(TAG, "The response from the biometricPromptResult was ${biometricPromptResult.authenticationResult.authenticationType}")
validatePasskey(
publicKeyRequest.requestJson,
origin,
packageName,
uid,
passkey.username,
credId,
privateKey
)
} else {
val error = biometricPromptResult.authenitcationError
// Process the error
}
// Other logic...