ב-Android 15, מנהל פרטי הכניסה תומך בתהליך הקשה אחד לפרטי הכניסה בכל מה שקשור ליצירה ולאחזור. בתהליך הזה, המידע של פרטי הכניסה הוא מוצגים ישירות בהנחיה הביומטרית, יחד עם עם נקודת כניסה לאפשרויות נוספות. התהליך הפשוט הזה יוצר תהליך יצירה ואחזור יעיל ויעיל של פרטי כניסה.
דרישות:
- המידע הביומטרי הוגדר במכשיר של המשתמש, והמשתמש מאפשר לו: לבצע אימות באפליקציות.
- בתהליכי כניסה, התכונה הזו מופעלת בתרחישים של חשבון יחיד בלבד, גם אם יש כמה פרטי כניסה (כמו מפתח גישה וסיסמה) שזמינים לחשבון הזה.
הפעלת תהליכי היצירה של מפתחות גישה בהקשה אחת
שלבי היצירה של השיטה הזו תואמים ליצירה הקיימת של פרטי הכניסה
התהליך. ב-BeginCreatePublicKeyCredentialRequest
, משתמשים ב-handleCreatePasskeyQuery()
כדי לעבד את הבקשה אם היא מתייחסת למפתח גישה.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
בhandleCreatePasskeyQuery()
, יש לכלול את BiometricPromptData
עם
המחלקה CreateEntry
:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
ספקי פרטי הכניסה צריכים להגדיר במפורש את המאפיין allowedAuthenticator
במופע BiometricPromptData
. אם הנכס הזה לא מוגדר, הערך שמוגדר כברירת מחדל הוא DEVICE_WEAK
. אם צריך, מגדירים את המאפיין האופציונלי cryptoObject
במיוחד למקרה כזה.
הפעלת תהליכי מפתח גישה לכניסה באמצעות הקשה אחת
בדומה לתהליך יצירת מפתח הגישה, התהליך הזה יתבצע בהתאם להגדרה הקיימת לטיפול בכניסה של משתמשים. מתחת לBeginGetPublicKeyCredentialOption
, משתמשים
populatePasskeyData()
כדי לאסוף את המידע הרלוונטי על
בקשת אימות:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
בדומה ל-CreateEntry
, מכונה של BiometricPromptData
מוגדרת למכונה של PublicKeyCredentialEntry
. אם לא מגדירים במפורש, allowedAuthenticator
מקבל את הערך BIOMETRIC_WEAK
כברירת מחדל.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
טיפול בבחירת פרטי הכניסה
בזמן הטיפול בבחירת רשומת פרטי הכניסה לצורך יצירת מפתח גישה, או
בחירת מפתח גישה במהלך הכניסה, קריאה ל-PendingIntentHandler's
retrieveProviderCreateCredentialRequest
, או
retrieveProviderGetCredentialRequest
, לפי הצורך. האובייקטים מוחזרים
שמכילים את המטא-נתונים שדרושים לספק. לדוגמה, כאשר מטפלים
בחירת רשומה ליצירת מפתח גישה, מעדכנים את הקוד כמו שמוצג:
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...
}
בדוגמה הזו מוצג מידע על הצלחת התהליך הביומטרי. כמו כן
שמכיל מידע נוסף על פרטי הכניסה. אם התהליך נכשל, משתמשים ברכיב
קוד שגיאה מתחת ל-biometricPromptResult.authenticationError
כדי לקבל החלטות.
קודי השגיאה שהוחזרו כחלק מ
biometricPromptResult.authenticationError.errorCode
הם אותם קודי שגיאה
מוגדרת בספריית androidx.biometric, כמו
androidx.biometric.BiometricPrompt.NO_SPACE,
androidx.biometric.BiometricPrompt.UNABLE_TO_Process,
androidx.biometric.BiometricPrompt.ERROR_TIMEOUT וכדומה.
ב-authenticationError
תהיה גם הודעת שגיאה שמשויכת אל
errorCode
שניתן להציג בממשק משתמש.
באופן דומה, חילוץ מטא-נתונים במהלך retrieveProviderGetCredentialRequest
.
יש לבדוק אם הנתיב הביומטרי שלך הוא null
. אם כן, מגדירים את הזיהוי הביומטרי שלכם לאימות. אופן הביצוע של פעולת 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...