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

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