دمج ميزة إنشاء مفتاح مرور بنقرة واحدة وتسجيل الدخول مع إشعارات المقاييس الحيوية

في نظام 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...