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

على نظام التشغيل 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...