আপনার হোল্ডার অ্যাপের মাধ্যমে ক্রেডেনশিয়াল ইস্যু করা ম্যানেজ করুন

ইস্যুকারীর থেকে ক্রেডেনশিয়াল পেতে ও স্টোর করতে, আপনার হোল্ডার অ্যাপকে ইস্যু করার ফ্লো ম্যানেজ করতে হবে। ক্রেডেনশিয়াল ইস্যু করার প্রসেস দুটি উপায়ে ট্রিগার করা যেতে পারে:

  • ইস্যুকারীর শুরু করা ফ্লো: ব্যবহারকারী ইস্যুকারীর অ্যাপ্লিকেশন বা ওয়েবসাইট থেকে VDC ইস্যু করার জন্য অনুরোধ ট্রিগার করেন। যেমন, কোনও ওয়েবসাইট তার ব্যবহারকারীদের "আপনার ওয়ালেটে পাসপোর্ট যোগ করুন" বিকল্প অফার করতে পারে। ইস্যুকারী OpenID4VCI ক্রেডেনশিয়াল অফারের অনুরোধ করতে ক্রেডেনশিয়াল ম্যানেজার ইস্যুয়েন্স API কল করে। এই ধরনের অনুরোধ ম্যানেজ করতে, হোল্ডারকে প্রথমে ক্রেডেনশিয়াল ম্যানেজারের সাথে ইন্টিগ্রেট করতে হবে যাতে এর মেটাডেটা রেজিস্টার করা যায়। ক্রেডেনশিয়াল ম্যানেজার ব্যবহারকারীর বেছে নেওয়ার জন্য প্রাসঙ্গিক বিকল্প দেখাবে। ব্যবহারকারী হোল্ডার বিকল্প বেছে নেওয়ার পরে, হোল্ডার অ্যাপ্লিকেশন চালু করা হবে এবং ইস্যু করার প্রক্রিয়া সম্পূর্ণ করার জন্য প্রয়োজনীয় ধাপগুলি অনুসরণ করা যাবে।
  • হোল্ডার-ইনিশিয়েটেড ফ্লো: ব্যবহারকারী তার হোল্ডার অ্যাপ্লিকেশন থেকে VDC যোগ করার অনুরোধ করেন। যেমন, কোনও হোল্ডার "আপনার পাসপোর্ট যোগ করুন" বোতাম অফার করতে পারে। এই ক্ষেত্রে, হোল্ডার তার সমর্থিত ইস্যুকারীর তালিকা এবং মেটাডেটা বজায় রাখে। এই ফাংশন সম্পূর্ণ করার জন্য Android ক্রেডেনশিয়াল ম্যানেজারের সাথে ইন্টিগ্রেট করার প্রয়োজন নেই।

Holder API-এর সাথে ক্রেডেনশিয়াল কীভাবে কাজ করে সেই সম্পর্কে আরও তথ্যের জন্য, ডিজিটাল ক্রেডেনশিয়াল স্টোর করা সম্পর্কে দেখুন।

Android ভার্সনের কম্প্যাটিবিলিটি

Holder API, Android 6 (API লেভেল 23) এবং তার পরবর্তী যেকোনও ভার্সনে কাজ করে।

প্রয়োগ

Credential Manager Holder API ব্যবহার করতে, আপনার অ্যাপ মডিউলের বিল্ড স্ক্রিপ্টে নিম্নলিখিত ডিপেন্ডেন্সি যোগ করুন:

গ্রোভি

dependencies {
    // Use to implement credentials registrys

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

}

কোটলিন

dependencies {
    // Use to implement credentials registrys

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

}

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 এবং ইস্যুকারীর পাঠানো ক্রেডেনশিয়াল অফার গ্রহণ করে ক্রেডেনশিয়াল ম্যানেজার UI-তে দেখানো এন্ট্রি নির্ধারণ করে। ম্যাচারের উদাহরণের জন্য ওপেন সোর্স উদাহরণ wallet app দেখুন।

ইস্যু করার অনুরোধ ম্যানেজ করা

এরপর, ব্যবহারকারী ক্রেডেনশিয়াল তৈরি করার বিকল্প বেছে নিলে, ওয়ালেটকে তা ম্যানেজ করতে হবে। স্যাম্পেল ওয়ালেট-এ দেখানো পদ্ধতি অনুযায়ী, androidx.credentials.registry.provider.action.CREATE_CREDENTIAL ইনটেন্ট ফিল্টার শোনে এমন অ্যাক্টিভিটি নির্ধারণ করুন।

অ্যাক্টিভিটি লঞ্চ করার ইনটেন্টে ক্রিয়েশন অনুরোধ ও কলিং অরিজিন থাকে, যা আপনি PendingIntentHandler.retrieveProviderCreateCredentialRequest ফাংশনের মাধ্যমে এক্সট্র্যাক্ট করতে পারবেন। API একটি ProviderCreateCredentialRequest রিটার্ন করে যাতে তৈরি করার অনুরোধের সাথে সম্পর্কিত সব তথ্য থাকে। দুটি মূল কম্পোনেন্ট আছে:

  • যে অ্যাপ অনুরোধ করেছে। আপনি getCallingAppInfo-এর সাহায্যে এটি ফিরিয়ে আনতে পারবেন।
  • কলিং অ্যাপ থেকে করা অনুরোধ। আপনি এটি getCallingRequest-এর মাধ্যমে ফিরিয়ে আনতে পারবেন, যা CreateCredentialRequest ফিরিয়ে আনে। অনুরোধটি ডিজিটাল ক্রেডেনশিয়ালের জন্য হলে, এটি CreateDigitalCredentialRequest-এর একটি ইনস্ট্যান্স, যার মধ্যে requestJson প্রপার্টিতে ইস্যু করার অনুরোধের JSON থাকে। আপনি নিম্নলিখিত স্যাম্পেল কোড ব্যবহার করে এটি প্রসেস করতে পারবেন:
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)
}

Key attestation

Key Attestation সম্পর্কে নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • Key Attestation তৈরি করার সময়, আপনি হয়ত BigInteger.toByteArray ব্যবহার করে কী মেটেরিয়ালকে, যেমন, JSON ওয়েব কীতে কনভার্ট করছেন। এই পদ্ধতি কখনও কখনও একটি সাইন বাইট যোগ করতে পারে এবং এর ফলে যাচাইকরণ ত্রুটি হতে পারে। এমন হলে, ইস্যুকারীকে Key Attestation পাঠানোর আগে এইসব বাইট সরিয়ে দিন।
  • আমরা android_key_attestation-কে মূল প্রমাণ হিসেবে ব্যবহার করার সাজেশন দিই।

তৈরি করার উত্তর ফিরিয়ে দিন

ক্রেডেনশিয়াল সেভ করার জন্য প্রয়োজনীয় ধাপগুলি Wallet সম্পূর্ণ করার পরে, ক্রেডেনশিয়াল রেসপন্স সহ অ্যাক্টিভিটি সম্পূর্ণ করুন:

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()

প্রসঙ্গে ক্রেডেনশিয়াল রেসপন্স ফিরিয়ে দেওয়ার সম্পূর্ণ উদাহরণ দেখতে, স্যাম্পেল অ্যাপ দেখুন।