Di Android 15, Pengelola Kredensial mendukung alur sekali ketuk untuk pembuatan dan pengambilan kredensial. Dalam alur ini, informasi kredensial yang dibuat, atau sedang digunakan, ditampilkan langsung di Biometric Prompt, bersama titik entri ke opsi lainnya. Proses yang disederhanakan ini menciptakan proses pembuatan dan pengambilan kredensial yang lebih efisien dan sederhana.
Persyaratan:
- Biometrik telah disiapkan di perangkat pengguna dan pengguna mengizinkannya untuk autentikasi ke aplikasi.
- Untuk alur login, fitur ini hanya diaktifkan untuk skenario satu akun, meskipun ada beberapa kredensial (seperti kunci sandi dan sandi) yang tersedia untuk akun tersebut.
Mengaktifkan sekali ketuk pada alur pembuatan kunci sandi
Langkah-langkah pembuatan metode ini cocok dengan proses pembuatan kredensial
yang ada. Dalam BeginCreatePublicKeyCredentialRequest
, gunakan
handleCreatePasskeyQuery()
untuk memproses permintaan jika permintaan tersebut ditujukan untuk kunci sandi.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
Di handleCreatePasskeyQuery()
, sertakan BiometricPromptData
dengan
class CreateEntry
:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Penyedia kredensial harus menetapkan properti allowedAuthenticator
secara eksplisit
dalam instance BiometricPromptData
. Jika properti ini tidak ditetapkan, nilainya
akan ditetapkan secara default ke DEVICE_WEAK
. Tetapkan properti cryptoObject
opsional jika diperlukan
untuk kasus penggunaan Anda.
Mengaktifkan sekali ketuk pada alur kunci sandi login
Serupa dengan alur pembuatan kunci sandi, hal ini akan mengikuti penyiapan yang ada untuk
menangani login pengguna. Di bagian BeginGetPublicKeyCredentialOption
, gunakan
populatePasskeyData()
untuk mengumpulkan informasi yang relevan tentang
permintaan autentikasi:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
Serupa dengan CreateEntry
, instance BiometricPromptData
ditetapkan ke
instance PublicKeyCredentialEntry
. Jika tidak ditetapkan secara eksplisit,
allowedAuthenticator
akan ditetapkan secara default ke BIOMETRIC_WEAK
.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Menangani pemilihan entri kredensial
Saat menangani pemilihan entri kredensial untuk pembuatan kunci sandi atau
pemilihan kunci sandi selama login, panggil PendingIntentHandler's
retrieveProviderCreateCredentialRequest
, atau
retrieveProviderGetCredentialRequest
, sebagaimana mestinya. Jenis ini menampilkan objek
yang berisi metadata yang diperlukan untuk penyedia. Misalnya, saat menangani
pemilihan entri pembuatan kunci sandi, perbarui kode Anda seperti yang ditunjukkan:
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...
}
Contoh ini berisi informasi tentang keberhasilan alur biometrik. File ini juga
berisi informasi lain tentang kredensial. Jika alur gagal, gunakan
kode error di bagian biometricPromptResult.authenticationError
untuk membuat keputusan.
Kode error yang ditampilkan sebagai bagian dari
biometricPromptResult.authenticationError.errorCode
adalah kode error yang sama
yang ditentukan dalam library androidx.biometric, seperti
androidx.biometric.BiometricPrompt.NO_SPACE,
androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS,
androidx.biometric.BiometricPrompt.ERROR_TIMEOUT, dan yang serupa. authenticationError
juga akan berisi pesan error yang terkait dengan
errorCode
yang dapat ditampilkan di UI.
Demikian pula, ekstrak metadata selama retrieveProviderGetCredentialRequest
.
Periksa apakah alur biometrik Anda adalah null
. Jika ya, konfigurasikan biometrik Anda sendiri untuk melakukan autentikasi. Hal ini mirip dengan cara instrumentasi operasi 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...