ב-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...