এই নির্দেশিকায় বিস্তারিতভাবে বর্ণনা করা হয়েছে কীভাবে DigitalCredential API ব্যবহার করে আপনার ব্যবহারকারীদের জন্য যাচাইকৃত ফোন নম্বর সংগ্রহ করা যায়। এই প্রক্রিয়ায় দুটি ধাপ রয়েছে:
-
TS.43 tokenজন্য অনুরোধ করুন : আপনার ক্লায়েন্ট অ্যাপ ("যাচাইকারী") ব্যবহারকারীর ডিভাইস থেকে একটি অস্থায়ী TS.43 টোকেনের জন্য অনুরোধ করে।TS.43 tokenহলো পরিষেবা প্রদানকারী সংস্থা কর্তৃক ইস্যুকৃত একটি পরিচয়পত্র যা ব্যবহারকারীর পরিচয় বহন করে। - টোকেনটি ফোন নম্বরের জন্য বিনিময় করুন : আপনার অ্যাপের ব্যাকএন্ড ব্যবহারকারীর যাচাইকৃত ফোন নম্বরের জন্য কোনো অ্যাগ্রিগেটর বা ক্যারিয়ারের সাথে
TS.43 tokenবিনিময় করে।
অ্যান্ড্রয়েড সংস্করণ সামঞ্জস্যতা
ফোন নম্বর যাচাইকরণ এপিআইটি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) এবং এর পরবর্তী সংস্করণগুলোতে সমর্থিত।
পূর্বশর্ত
DigitalCredential API ব্যবহার করে ফোন নম্বর যাচাইকরণ বাস্তবায়ন করতে, আপনার একটি অ্যাগ্রিগেটরের কাছে অ্যাকাউন্ট প্রয়োজন। একজন অ্যাগ্রিগেটর ক্যারিয়ারদের সাথে যোগাযোগ করে এবং আপনার অ্যাপের জন্য প্রয়োজনীয় API সারফেস সরবরাহ করে, যা সাধারণত একটি বিলযোগ্য ক্লাউড API এন্ডপয়েন্ট হিসেবে থাকে।
আপনার গ্রেডল বিল্ড স্ক্রিপ্টে নিম্নলিখিত ডিপেন্ডেন্সিগুলোও যোগ করতে হবে:
কোটলিন
dependencies { implementation("androidx.credentials:credentials:1.6.0") implementation("androidx.credentials:credentials-play-services-auth:1.6.0") }
গ্রোভি
dependencies { implementation "androidx.credentials:credentials:1.6.0" implementation "androidx.credentials:credentials-play-services-auth:1.6.0" }
বাস্তবায়ন
সম্পূর্ণ প্রক্রিয়াটি সাধারণত এই ধাপগুলো অনুসরণ করে:
- একটি অ্যাগ্রিগেটর থেকে DCQL (ডিজিটাল ক্রেডেনশিয়াল কোয়েরি ল্যাঙ্গুয়েজ) প্যারামিটার অনুরোধ করুন : এক বা একাধিক অ্যাগ্রিগেটরকে কল করুন এবং এক সেট DCQL প্যারামিটারের জন্য অনুরোধ করুন। DCQL আপনাকে প্রতিটি অ্যাগ্রিগেটর থেকে আপনার প্রয়োজনীয় সঠিক ডিজিটাল ক্রেডেনশিয়ালগুলো নির্দিষ্ট করে দেওয়ার সুযোগ দেয়।
OpenID4VP রিকোয়েস্ট তৈরি করুন : আপনার অ্যাপের ব্যাকএন্ড থেকে, অ্যাগ্রিগেটর থেকে DCQL প্যারামিটারগুলো অন্তর্ভুক্ত করে OpenID4VP রিকোয়েস্টটি তৈরি করুন। তারপর, রিকোয়েস্টটি আপনার ক্লায়েন্ট অ্যাপে পাঠান।
ক্রেডেনশিয়াল ম্যানেজার এপিআই কল করুন : আপনার ক্লায়েন্ট অ্যাপে, অপারেটিং সিস্টেমে OpenID4VP অনুরোধ পাঠাতে ক্রেডেনশিয়াল ম্যানেজার এপিআই ব্যবহার করুন। এর জবাবে, আপনি
TS.43 Digital Credentialসম্বলিত একটি OpenID4VP রেসপন্স অবজেক্ট পাবেন। এই ক্রেডেনশিয়ালটি এনক্রিপ্টেড থাকে এবং শুধুমাত্র সংশ্লিষ্ট অ্যাগ্রিগেটরই এটি ডিক্রিপ্ট করতে পারে। ক্যারিয়ার টোকেন পাওয়ার পর, আপনার ক্লায়েন্ট অ্যাপ থেকে অ্যাপের ব্যাকএন্ডে রেসপন্সটি পাঠিয়ে দিন।প্রতিক্রিয়া যাচাই করুন : আপনার অ্যাপের ব্যাকএন্ডে OpenID4VP প্রতিক্রিয়াটি যাচাই করুন।
ফোন নম্বরের জন্য বিনিময় : আপনার অ্যাপের ব্যাকএন্ড থেকে,
TS.43 Digital Credentialঅ্যাগ্রিগেটরের কাছে পাঠান। অ্যাগ্রিগেটর ক্রেডেনশিয়ালটি যাচাই করে এবং যাচাইকৃত ফোন নম্বরটি ফেরত দেয়।
একটি অ্যাগ্রিগেটর থেকে DCQL প্যারামিটার অনুরোধ করুন
আপনার অ্যাপের ব্যাকএন্ড থেকে, একটি ডিজিটাল ক্রেডেনশিয়াল কোয়েরি ল্যাঙ্গুয়েজ (DCQL) ক্রেডেনশিয়াল অবজেক্টের জন্য অ্যাগ্রিগেটরের কাছে একটি অনুরোধ পাঠান। আপনার অনুরোধে একটি ননস (nonce) এবং একটি রিকোয়েস্ট আইডি (request ID) অবশ্যই উল্লেখ করবেন। অ্যাগ্রিগেটরটি DCQL ক্রেডেনশিয়াল অবজেক্টটি ফেরত দেয়, যার গঠনটি নিম্নলিখিতের অনুরূপ:
{
// The credential ID is mapped to the request ID that is sent in your request to the aggregator.
"id": "aggregator1",
"format": "dc-authorization+sd-jwt",
"meta": {
"vct_values": [
"number-verification/device-phone-number/ts43"
],
"credential_authorization_jwt": "..."
},
"claims": [
{
"path": ["subscription_hint"],
"values": [1]
},
{
"path": ["phone_number_hint"],
"values": ["+14155552671"]
}
]
}
OpenID4VP অনুরোধ তৈরি করুন
প্রথমে, আপনার অ্যাপের ব্যাকএন্ড থেকে, নিম্নলিখিত উদাহরণে দেখানো অনুযায়ী একটি dcql_query অবজেক্টের ভিতরে থাকা credentials অ্যারেতে DCQL ক্রেডেনশিয়াল অবজেক্টটি রেখে একটি dcql_query অবজেক্ট তৈরি করুন:
"dcql_query": {
"credentials": [
"id": "aggregator1",
"format": "dc-authorization+sd-jwt",
"meta": {
"vct_values": [
"number-verification/device-phone-number/ts43"
],
"credential_authorization_jwt": "..."
},
"claims": [
{
"path": ["subscription_hint"],
"values": [1]
},
{
"path": ["phone_number_hint"],
"values": ["+14155552671"]
}
]
]
}
এরপর, নিম্নলিখিত কাঠামো অনুযায়ী একটি OpenID4VP অনুরোধ তৈরি করুন:
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"response_type": "vp_token",
"response_mode": "dc_api",
"nonce": "...",
"dcql_query": { ... }
}
}
-
protocol: ফোন নম্বর যাচাইয়ের অনুরোধের জন্য এটি অবশ্যইopenid4vp-v1-unsignedএ সেট করতে হবে। -
response_typeএবংresponse_mode: এই ধ্রুবকগুলো অনুরোধের ধরন নির্দেশ করে এবং এদের নির্দিষ্ট মান হলো যথাক্রমেvp_tokenএবংdc_api। -
nonce: প্রতিটি অনুরোধের জন্য আপনার ব্যাকএন্ড দ্বারা তৈরি একটি অনন্য মান। অ্যাগ্রিগেটর DCQL ক্রেডেনশিয়াল অবজেক্টের ননস অবশ্যই এই ননসের সাথে মিলতে হবে। -
dcql_query: এক্ষেত্রে, একটিTS.43 Digital Credentialঅনুরোধ করা হচ্ছে তা নির্দিষ্ট করতেdcql_queryব্যবহার করুন। আপনি এখানে অন্যান্য ডিজিটাল ক্রেডেনশিয়ালের জন্যও অনুরোধ করতে পারেন।
এরপর, OpenID4VP অনুরোধটিকে একটি DigitalCredential API অনুরোধ অবজেক্টে মুড়ে ক্লায়েন্ট অ্যাপে পাঠিয়ে দিন।
{
"requests":
[
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"response_type": "vp_token",
"response_mode": "dc_api",
"nonce": "...",
"dcql_query": { ... }
}
}
]
}
নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে DigitalCredential API অনুরোধ তৈরি করতে হয়:
def GenerateDCRequest():
credentials = []
aggregator1_dcql = call_aggregator_endpoint(nonce, "aggregator1", additional_params)
credentials.append(aggregator1_dcql) # You can optionally work with multiple
# aggregators, or request other types of credentials
val dc_request =
{
"requests":
[
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"response_type": "vp_token",
"response_mode": "dc_api",
"nonce": "...",
"dcql_query": {"credentials": credentials}
}
}
]
}
return dc_request
ক্রেডেনশিয়াল ম্যানেজার এপিআই কল করুন
আপনার ক্লায়েন্ট অ্যাপে, অ্যাপের ব্যাকএন্ড থেকে পাওয়া DigitalCredential API অনুরোধটি ব্যবহার করে Credential Manager API-কে কল করুন।
val requestJson = generateTs43DigitalCredentialRequestFromServer()
val digiCredOption = GetDigitalCredentialOption(requestJson = requestJson)
val getCredRequest = GetCredentialRequest(
listOf(digiCredOption)
)
coroutineScope.launch {
try {
val response = credentialManager.getCredential(
context = activityContext,
request = getCredRequest
)
val credential = response.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}")
}
}
} catch (e : GetCredentialException) {
// If user cancels the operation, the feature isn't available, or the
// SIM doesn't support the feature, a GetCredentialCancellationException
// will be returned. Otherwise, a GetCredentialUnsupportedException will
// be returned with details in the exception message.
handleFailure(e)
}
}
DigitalCredential API-এর রেসপন্সে OpenID4VP রেসপন্সটি থাকে। DigitalCredential রেজাল্ট থেকে প্রাপ্ত একটি সাধারণ ক্রেডেনশিয়াল json নিচে দেওয়া হলো:
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"vp_token": {
"aggregator1": ["eyJhbGciOiAiRVMy..."] # The encrypted TS.43 Digital
# Credential in an array structure.
}
}
}
আপনার ক্লায়েন্ট অ্যাপ থেকে DigitalCredential API-এর প্রতিক্রিয়াটি ব্যাকএন্ড সার্ভারে ফেরত পাঠান, যেখানে এটি যাচাই করা যাবে এবং কোনো অ্যাগ্রিগেটরের সাথে যাচাইকৃত ফোন নম্বরের বিনিময়ে ব্যবহার করা যাবে।
কিছু ক্ষেত্রে, রেসপন্সে একটি TS.43 এরর থাকতে পারে। এরর রেসপন্সটি হলো একটি json অবজেক্ট যা OpenID4VP এরর রেসপন্স ফরম্যাট অনুসরণ করে:
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"error": "<error_code>",
"error_description": "<Human-readable description of the error>",
}
}
error_code দুটি সম্ভাব্য মান রয়েছে:
-
invalid_request: এটি নির্দেশ করে যে অনুরোধটি ত্রুটিপূর্ণ ছিল। -
server_error: এটি নির্দেশ করে যে অনুরোধটি প্রক্রিয়া করার সময় ব্যর্থতা ঘটেছে। এটি স্থানীয় ত্রুটি বা TS.43 সংক্রান্ত সমস্যা হতে পারে।
error_description ফিল্ডটি সমস্যাটি সম্পর্কে অতিরিক্ত বিবরণ প্রদান করে।
ডিজিটাল পরিচয়পত্রের প্রতিক্রিয়া যাচাই করুন
আপনার অ্যাপের ব্যাকএন্ডে কীভাবে রেসপন্সটি পার্স করতে এবং ভ্যালিডেশন ধাপটি সম্পন্ন করতে হয়, তার একটি উদাহরণ নিচে দেওয়া হলো:
def processDigitalCredentialsResponse(response):
# Step 1: Parse out the TS.43 Digital Credential from the response
openId4VpResponse = response['data']
ts43_digital_credential = response['vp_token']["aggregator1"][0]
# Step 2: Perform response validation
verifyResponse(ts43_digital_credential)
def verifyResponse(ts43_digital_credential):
# The returned ts43_digital_credential is an SD-JWT-based Verifiable Credentials
# (SD-JWT VC) as defined in this IETF spec. The section 3.4 of the specification
# outlines how to validate the credential. At a high level, the steps involves
# validating (1) the nonce in the response credential matches the one in the
# request, (2) the integrity of the credential by checking the credential is
# signed by the trusted issuer Android Telephony, and (3) other validity
# properties associated with this credential, such as issue time and expiration
# time
# In most cases, you can use an SD-JWT VC library to perform these validations.
# Some aggregators may also perform the validation logic for you. Check with your
# aggregator to decide the exact scope of the validation required.
ফোন নম্বরের বিনিময়
আপনার অ্যাপের ব্যাকএন্ড থেকে, যাচাইকৃত TS.43 Digital Credential অ্যাগ্রিগেটরের এন্ডপয়েন্টে পাঠান, যাতে ক্রেডেনশিয়ালটি যাচাই করা যায় এবং যাচাইকৃত ফোন নম্বরটি গ্রহণ করা যায়।
def processDigitalCredentialsResponse(response):
# ... prior steps
# Step 3: Call aggregator endpoint to exchange the verified phone number
callAggregatorPnvEndpoint(ts43_digital_credential)