ב-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
. אם כן, מגדירים את הזיהוי הביומטרי שלכם לאימות. זה דומה לאופן שבו פעולת הקבלה מתבצעת:
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...