ক্রেডেনশিয়াল ম্যানেজার - যাচাইকারী API

অ্যান্ড্রয়েড অ্যাপের মধ্যে ডিজিটাল পরিচয়পত্র যাচাইকরণ একজন ব্যবহারকারীর পরিচয় (যেমন সরকারি পরিচয়পত্র), সেই ব্যবহারকারীর বিভিন্ন বৈশিষ্ট্য (যেমন ড্রাইভিং লাইসেন্স, শিক্ষাগত ডিগ্রি, বা বয়স বা ঠিকানার মতো বিবরণ), অথবা এমন অন্যান্য পরিস্থিতি যেখানে কোনো সত্তার সত্যতা নিশ্চিত করার জন্য একটি পরিচয়পত্র জারি এবং যাচাই করার প্রয়োজন হয়, সেগুলোর প্রমাণীকরণ ও অনুমোদন করতে ব্যবহার করা যেতে পারে।

ডিজিটাল ক্রেডেনশিয়ালস হলো একটি পাবলিক W3C স্ট্যান্ডার্ড, যা একটি ডিজিটাল ওয়ালেট থেকে ব্যবহারকারীর যাচাইযোগ্য ডিজিটাল ক্রেডেনশিয়ালস অ্যাক্সেস করার পদ্ধতি নির্দিষ্ট করে। এটি ওয়েব ব্যবহারের জন্য W3C ক্রেডেনশিয়াল ম্যানেজমেন্ট এপিআই (API) দ্বারা বাস্তবায়িত হয়। অ্যান্ড্রয়েডে, ডিজিটাল ক্রেডেনশিয়ালস যাচাই করার জন্য ক্রেডেনশিয়াল ম্যানেজারের DigitalCredential এপিআই (API) ব্যবহৃত হয়।

অ্যান্ড্রয়েড সংস্করণ সামঞ্জস্যতা

ভেরিফায়ার এপিআই অ্যান্ড্রয়েড ৬ (এপিআই লেভেল ২৩) এবং এর পরবর্তী সংস্করণগুলোতে সমর্থিত।

বাস্তবায়ন

আপনার অ্যান্ড্রয়েড প্রজেক্টে ডিজিটাল পরিচয়পত্র যাচাই করতে, নিম্নলিখিতগুলি করুন:

  1. আপনার অ্যাপের বিল্ড স্ক্রিপ্টে ডিপেন্ডেন্সি যোগ করুন এবং একটি CredentialManager ক্লাস ইনিশিয়ালাইজ করুন।
  2. একটি ডিজিটাল ক্রেডেনশিয়াল রিকোয়েস্ট তৈরি করুন এবং এটি ব্যবহার করে একটি DigitalCredentialOption ইনিশিয়ালাইজ করুন, এরপর GetCredentialRequest তৈরি করুন।
  3. একটি সফল GetCredentialResponse গ্রহণ করতে অথবা উদ্ভূত যেকোনো ব্যতিক্রম সামাল দিতে, তৈরি করা অনুরোধটি সহ getCredential ফ্লোটি চালু করুন। সফলভাবে প্রাপ্ত হলে, প্রতিক্রিয়াটি যাচাই করুন।

নির্ভরতা যোগ করুন এবং প্রারম্ভিকীকরণ করুন

আপনার গ্রেডল বিল্ড স্ক্রিপ্টে নিম্নলিখিত ডিপেন্ডেন্সিগুলো যোগ করুন:

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-beta01")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-beta01")
}

এরপরে, CredentialManager ক্লাসের একটি ইনস্ট্যান্স ইনিশিয়ালাইজ করুন।

val credentialManager = CredentialManager.create(context)

একটি ডিজিটাল পরিচয়পত্র অনুরোধ তৈরি করুন

একটি ডিজিটাল ক্রেডেনশিয়াল অনুরোধ তৈরি করুন এবং এটি ব্যবহার করে একটি DigitalCredentialOption ইনিশিয়ালাইজ করুন।

// The request in the JSON format to conform with
// the JSON-ified Credential Manager - Verifier API request definition.
val requestJson = generateRequestFromServer()
val digitalCredentialOption =
    GetDigitalCredentialOption(requestJson = requestJson)

// Use the option from the previous step to build the `GetCredentialRequest`.
val getCredRequest = GetCredentialRequest(
    listOf(digitalCredentialOption)
)

এখানে একটি OpenId4Vp অনুরোধের উদাহরণ দেওয়া হলো। এর সম্পূর্ণ তথ্যসূত্র এই ওয়েবসাইটে পাওয়া যাবে।

{
  "requests": [
    {
      "protocol": "openid4vp-v1-unsigned",
      "data": {
        "response_type": "vp_token",
        "response_mode": "dc_api",
        "nonce": "OD8eP8BYfr0zyhgq4QCVEGN3m7C1Ht_No9H5fG5KJFk",
        "dcql_query": {
          "credentials": [
            {
              "id": "cred1",
              "format": "mso_mdoc",
              "meta": {
                "doctype_value": "org.iso.18013.5.1.mDL"
              },
              "claims": [
                {
                  "path": [
                    "org.iso.18013.5.1",
                    "family_name"
                  ]
                },
                {
                  "path": [
                    "org.iso.18013.5.1",
                    "given_name"
                  ]
                },
                {
                  "path": [
                    "org.iso.18013.5.1",
                    "age_over_21"
                  ]
                }
              ]
            }
          ]
        }
      }
    }
  ]
}

পরিচয়পত্রটি সংগ্রহ করুন

তৈরি করা অনুরোধটি দিয়ে getCredential ফ্লোটি চালু করুন। আপনি একটি সফল GetCredentialResponse পাবেন, অথবা অনুরোধটি ব্যর্থ হলে একটি GetCredentialException পাবেন।

getCredential ফ্লোটি ব্যবহারকারীর কাছে উপলব্ধ ক্রেডেনশিয়াল বিকল্পগুলো উপস্থাপন করতে এবং তার নির্বাচন সংগ্রহ করতে অ্যান্ড্রয়েড সিস্টেম ডায়ালগ চালু করে। এরপর, নির্বাচিত ক্রেডেনশিয়াল বিকল্পটি ধারণকারী ওয়ালেট অ্যাপটি সম্মতি সংগ্রহ করতে এবং একটি ডিজিটাল ক্রেডেনশিয়াল প্রতিক্রিয়া তৈরি করার জন্য প্রয়োজনীয় পদক্ষেপগুলো সম্পাদন করতে ইউজার ইন্টারফেস (UI) প্রদর্শন করবে।

coroutineScope.launch {
    try {
        val result = credentialManager.getCredential(
            context = activityContext,
            request = getCredRequest
        )
        verifyResult(result)
    } catch (e : GetCredentialException) {
        handleFailure(e)
    }
}

// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
    val credential = result.credential
    when (credential) {
        is DigitalCredential -> {
            val responseJson = credential.credentialJson
            validateResponseOnServer(responseJson)
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential ${credential.type}")
        }
    }
}

// Handle failure.
fun handleFailure(e: GetCredentialException) {
  when (e) {
        is GetCredentialCancellationException -> {
            // The user intentionally canceled the operation and chose not
            // to share the credential.
        }
        is GetCredentialInterruptedException -> {
            // Retry-able error. Consider retrying the call.
        }
        is NoCredentialException -> {
            // No credential was available.
        }
        is CreateCredentialUnknownException -> {
            // An unknown, usually unexpected, error has occurred. Check the
            // message error for any additional debugging information.
        }
        is CreateCredentialCustomException -> {
            // You have encountered a custom error thrown by the wallet.
            // If you made the API call with a request object that's a
            // subclass of CreateCustomCredentialRequest using a 3rd-party SDK,
            // then you should check for any custom exception type constants
            // within that SDK to match with e.type. Otherwise, drop or log the
            // exception.
        }
        else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
    }
}