التعامل مع إصدار المستندات باستخدام تطبيق حامل المستند

لتلقّي بيانات الاعتماد من جهات الإصدار وتخزينها، يحتاج تطبيق المحفظة إلى معالجة عمليات إصدار بيانات الاعتماد. في عملية إصدار بيانات الاعتماد، يرسل الموقع الإلكتروني أو التطبيق التابع لجهة الإصدار عرضًا لبيانات الاعتماد إلى تطبيق المحفظة يتضمّن التفاصيل اللازمة لتوفير بيانات الاعتماد. يستخدم تطبيق المحفظة RegistryManager للتسجيل في "مدير بيانات الاعتماد" لأنواع بيانات الاعتماد التي ينوي معالجتها. ويسمح ذلك بعرض التطبيق للمستخدم واختياره أثناء طلب إصدار بيانات الاعتماد لتلقّيها.

لمزيد من المعلومات حول طريقة عمل بيانات الاعتماد مع Holder API، يُرجى قراءة الـ مفاهيم الأساسية في Holder API.

التوافق مع إصدارات Android

تتوفّر واجهة برمجة التطبيقات Holder API على Android 6 (المستوى 23 من واجهة برمجة التطبيقات) والإصدارات الأحدث.

التنفيذ

لاستخدام Holder API في "مدير بيانات الاعتماد"، أضِف التبعيات التالية إلى نص برمجة الإصدار في وحدة تطبيقك:

رائع

dependencies {
    // Use to implement credentials registrys

    implementation "androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-provider:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04"

}

Kotlin

dependencies {
    // Use to implement credentials registrys

    implementation("androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-provider:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04")

}

إنشاء RegistryManager

أنشِئ مثيلاً من RegistryManager وسجِّل معه طلب RegisterCreationOptionsRequest.

val registryManager = RegistryManager.create(context)

try {
    registryManager.registerCreationOptions(object :
        RegisterCreationOptionsRequest(
            creationOptions = buildIssuanceData(),
            matcher = loadIssuanceMatcher(),
            type = DigitalCredential.TYPE_DIGITAL_CREDENTIAL,
            id = "openid4vci",
        ) {}
    )
} catch (e: Exception) {
    Log.e(TAG, "Issuance registration failed.", e)
}

المطابِق هو ملف ثنائي بتنسيق WebAssembly (Wasm) سيتلقّى creationOptions الذي تم ضبطه أثناء التسجيل وعرض بيانات الاعتماد الذي أرسلته جهة الإصدار لتحديد الإدخالات المعروضة على واجهة مستخدم "مدير بيانات الاعتماد". يُرجى الرجوع إلى تطبيق المحفظة كمثال مفتوح المصدر للاطّلاع على مثال على المطابِق.

معالجة طلب إصدار

بعد ذلك، على المحفظة معالجة الحالة التي يختار فيها المستخدم خيار إنشاء بيانات الاعتماد. حدِّد نشاطًا يستمع إلى فلتر النية androidx.credentials.registry.provider.action.CREATE_CREDENTIAL، كما هو موضّح في نموذج المحفظة.

تحتوي النية التي تطلق النشاط على طلب الإنشاء والمصدر الذي أطلق الطلب، ويمكنك استخراجها باستخدام الدالة PendingIntentHandler.retrieveProviderCreateCredentialRequest. تعرض واجهة برمجة التطبيقات ProviderCreateCredentialRequest التي تحتوي على جميع المعلومات المرتبطة بطلب الإنشاء. هناك مكوّنان رئيسيان:

  • التطبيق الذي أرسل الطلب: يمكنك استرداد هذا التطبيق باستخدام `getCallingAppInfo`. يمكنك استرداد هذا التطبيق باستخدام getCallingAppInfo.
  • الطلب من التطبيق الذي أطلق الطلب: يمكنك استرداد هذا الطلب باستخدام getCallingRequest، التي تعرض CreateCredentialRequest. إذا كان الطلب مخصّصًا لبيانات الاعتماد الرقمية، يكون مثيلاً من CreateDigitalCredentialRequest، الذي يحتوي على JSON لطلب الإصدار في السمة requestJson. يمكنك معالجة ذلك باستخدام نموذج الرمز البرمجي التالي:
val pendingIntentRequest =
    PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
val request = pendingIntentRequest!!.callingRequest
if (request is CreateDigitalCredentialRequest) {
    Log.i(TAG, "Got DC creation request: ${request.requestJson}")
    processCreationRequest(request.requestJson)
}

مصادقة المفتاح

يُرجى ملاحظة ما يلي بشأن مصادقة المفتاح:

  • عند إنشاء مصادقة مفتاح، قد تستخدم BigInteger.toByteArray() لتحويل مواد المفتاح إلى، على سبيل المثال، مفتاح JSON على الويب. يمكن أن تضيف هذه الطريقة أحيانًا بايت علامة وتتسبب في حدوث خطأ في التحقّق من الصحة. إذا حدث ذلك، أزِل هذه البايتات قبل إرسال مصادقة المفتاح إلى جهة الإصدار.
  • ننصحك بـ استخدام android_key_attestation كنوع لإثبات المفتاح.

عرض استجابة الإنشاء

بعد أن تكمل المحفظة الخطوات اللازمة لحفظ بيانات الاعتماد، أكمِل النشاط باستخدام استجابة بيانات الاعتماد:

val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
    resultData,
    CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()

إذا حدث استثناء، يمكنك إرسال استثناء بيانات الاعتماد بطريقة مماثلة:

val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
    resultData,
    CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()

للاطّلاع على مثال كامل على عرض استجابة بيانات الاعتماد في السياق، يُرجى الاطّلاع على نموذج التطبيق.