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

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