שילוב של יצירת מפתח גישה בהקשה אחת וכניסה לחשבון באמצעות הנחיות ביומטריות

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