ডিজিটাল আইডি ইন-অ্যাপ এবং ওয়েব ফ্লো উভয়ই গ্রহণ করা যেতে পারে। Google Wallet থেকে শংসাপত্রগুলি গ্রহণ করতে আপনার প্রয়োজন হবে:
- প্রদত্ত নির্দেশাবলী অনুসরণ করে অ্যাপ বা ওয়েব ব্যবহার করে সংহত করুন।
- Google Wallet স্যান্ডবক্সে আপনার প্রবাহ পরীক্ষা করতে পরীক্ষা আইডি ব্যবহার করুন।
- আপনি যখন লাইভ হওয়ার জন্য প্রস্তুত হন, তখন অনুরোধ করতে এই ফর্মটি পূরণ করুন এবং Google Wallet থেকে শংসাপত্র গ্রহণের পরিষেবার শর্তাবলীতে সম্মত হন৷
পূর্বশর্ত
ডিজিটালভাবে আইডিগুলির উপস্থাপনা পরীক্ষা করার জন্য, আপনাকে প্রথমে উদ্দেশ্যযুক্ত পরীক্ষা অ্যাকাউন্ট ব্যবহার করে সর্বজনীন বিটা প্রোগ্রামে নথিভুক্ত করতে হবে (এটি একটি জিমেইল অ্যাকাউন্ট হতে হবে)। পরবর্তীকালে, আপনার মনোনীত Google পরিচিতিতে পরবর্তী বিশদগুলি সরবরাহ করুন৷
- পরিষেবার শর্তাবলী লিঙ্ক
- লোগো
- ওয়েবসাইট
- অ্যাপ প্যাকেজ আইডি (অ্যান্ড্রয়েড অ্যাপ ইন্টিগ্রেশনের জন্য)
- dev/debug বিল্ড সহ
- অ্যাপ স্বাক্ষর
-
$ $ANDROID_SDK/build-tools/$BUILD_TOOLS_VERSION/apksigner verify --print-certs -v $APK
-
- জিমেইল আইডি যা সর্বজনীন বিটাতে যোগদানের জন্য ব্যবহার করা হয়েছিল
সমর্থিত শংসাপত্র বিন্যাস
বেশ কয়েকটি প্রস্তাবিত মান বিদ্যমান যা ডিজিটাল পরিচয় নথিগুলির ডেটা বিন্যাসকে সংজ্ঞায়িত করে, দুটি উল্লেখযোগ্য শিল্প আকর্ষণ অর্জনের সাথে:
- mdocs - ISO দ্বারা সংজ্ঞায়িত।
- w3c যাচাইযোগ্য শংসাপত্র - w3c দ্বারা সংজ্ঞায়িত।
অ্যান্ড্রয়েড ক্রেডেনশিয়াল ম্যানেজার উভয় ফর্ম্যাট সমর্থন করে, Google Wallet এই মুহূর্তে শুধুমাত্র mdoc ভিত্তিক ডিজিটাল আইডি সমর্থন করে।
সমর্থিত শংসাপত্র
Google Wallet 2টি শংসাপত্রের ধরন সমর্থন করে:
- মোবাইল ড্রাইভার লাইসেন্স (mDL)
- আইডি পাস
আপনি একটি একক পরামিতি পরিবর্তনের সাথে আপনার প্রবাহে শংসাপত্রের জন্য অনুরোধ করতে পারেন।
ব্যবহারকারীর অভিজ্ঞতা
এই বিভাগটি প্রস্তাবিত অনলাইন উপস্থাপনা প্রবাহ সম্পর্কে কথা বলে। প্রবাহটি অ্যালকোহল বিতরণের জন্য একটি অ্যাপে বয়সের উপস্থাপনা দেখায়, তবে ইউএক্স ওয়েবের পাশাপাশি অন্যান্য ধরণের উপস্থাপনার জন্যও একই রকম।
![]() | ![]() | ![]() | ![]() | ![]() |
ব্যবহারকারীকে অ্যাপ বা ওয়েবসাইটে বয়স যাচাই করতে বলা হয়েছে | ব্যবহারকারী উপলব্ধ যোগ্য শংসাপত্রগুলি দেখেন৷ | ব্যবহারকারী Google Wallet-এ নিশ্চিতকরণ পৃষ্ঠা দেখেন | শেয়ারিং নিশ্চিত করতে ব্যবহারকারী প্রমাণীকরণ করে | অ্যাপ বা ওয়েবসাইটে ডেটা পাঠানো হয়েছে |
মূল নোট
- অ্যাপ বা ওয়েবসাইটের নমনীয়তা রয়েছে যে তারা কীভাবে এপিআই-তে এন্ট্রি পয়েন্ট তৈরি করে। ধাপ 1-এ দেখানো হিসাবে, আমরা একটি সাধারণ বোতাম দেখানোর সুপারিশ করি যেমন "ডিজিটাল আইডি দিয়ে যাচাই করুন" যেহেতু ওভারটাইম আমরা আশা করি যে Google Wallet এর বাইরেও বিকল্পগুলি API-এর মাধ্যমে উপলব্ধ হবে।
- ধাপ 2 এ নির্বাচক স্ক্রীনটি Android দ্বারা রেন্ডার করা হয়েছে। যোগ্য শংসাপত্রগুলি প্রতিটি Wallet দ্বারা প্রদত্ত নিবন্ধন যুক্তি এবং নির্ভরকারী পক্ষের পাঠানো অনুরোধের মধ্যে একটি মিল দ্বারা নির্ধারিত হয়
- ধাপ 3 Google Wallet দ্বারা রেন্ডার করা হয়েছে। Google Wallet এই স্ক্রিনে ডেভেলপারের দেওয়া নাম, লোগো এবং গোপনীয়তা নীতি দেখাবে।
একটি ডিজিটাল আইডি প্রবাহ যোগ করুন
যদি ব্যবহারকারীর কাছে কোনো শংসাপত্র না থাকে তবে আমরা "ডিজিটাল আইডি দিয়ে যাচাই করুন" বোতামের পাশে একটি লিঙ্ক প্রদান করার পরামর্শ দিই যা ব্যবহারকারীকে একটি ডিজিটাল আইডি যোগ করার অনুমতি দেওয়ার জন্য Google Wallet-এ গভীর-লিঙ্ক করবে৷
![]() | ![]() |
ব্যবহারকারীকে অ্যাপ বা ওয়েবসাইটে বয়স যাচাই করতে বলা হয়েছে | একটি ডিজিটাল আইডি পেতে ব্যবহারকারীকে Google Wallet-এ নিয়ে যাওয়া হয়েছে৷ |
কোনো ডিজিটাল আইডি উপলব্ধ নেই
যদি ব্যবহারকারী ডিজিটাল আইডি ছাড়াই "ডিজিটাল আইডি দিয়ে যাচাই করুন" বিকল্পটি নির্বাচন করেন তবে তাদের এই ত্রুটি বার্তাটি দেখানো হবে।
![]() | ![]() |
ব্যবহারকারীকে অ্যাপ বা ওয়েবসাইটে বয়স যাচাই করতে বলা হয়েছে | ব্যবহারকারী একটি ত্রুটি দেখিয়েছেন যে তাদের একটি ডিজিটাল আইডি নেই |
ব্যবহারকারীর গোপনীয়তা রক্ষা করার জন্য ব্যবহারকারীর কাছে উপলব্ধ ডিজিটাল আইডি আছে কিনা তা নীরবে শিখতে API একটি বৈশিষ্ট্য সমর্থন করে না। তাই আমরা দেখানো হিসাবে অনবোর্ডিং লিঙ্ক বিকল্প অন্তর্ভুক্ত করার সুপারিশ.
ওয়ালেট থেকে আইডি শংসাপত্রের জন্য অনুরোধের বিন্যাস
এখানে একটি Android ডিভাইস বা ওয়েবে যেকোনো ওয়ালেট থেকে পরিচয় শংসাপত্র পাওয়ার জন্য একটি mdoc requestJson
একটি নমুনা রয়েছে।
{
"requests" : [
{
"protocol": "openid4vp",
"data": {<credential_request>} // This is an object, shouldn't be a string.
}
]
}
এনক্রিপশনের অনুরোধ করুন
client_metadata
প্রতিটি অনুরোধের জন্য এনক্রিপশন পাবলিক কী ধারণ করে। আপনাকে প্রতিটি অনুরোধের জন্য ব্যক্তিগত কী সঞ্চয় করতে হবে এবং আপনি ওয়ালেট অ্যাপ থেকে প্রাপ্ত টোকেনটিকে প্রমাণীকরণ ও অনুমোদন করতে এটি ব্যবহার করতে হবে।
requestJson
এর credential_request
প্যারামিটারে নিম্নলিখিত ক্ষেত্রগুলি থাকবে।
{
"response_type": "vp_token",
"response_mode": "dc_api.jwt",
"nonce": "1234",
"dcql_query": {
"credentials": [
{
"id": "cred1",
"format": "mso_mdoc",
"meta": {
"doctype_value": "org.iso.18013.5.1.mDL" // this is for mDL. Use com.google.wallet.idcard.1 for ID pass
},
"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_18"
]
}
]
}
]
},
"client_metadata": {
"jwks": {
"keys": [ // sample request encryption key
{
"kty": "EC",
"crv": "P-256",
"x": "pDe667JupOe9pXc8xQyf_H03jsQu24r5qXI25x_n1Zs",
"y": "w-g0OrRBN7WFLX3zsngfCWD3zfor5-NLHxJPmzsSvqQ",
"use": "enc",
"kid" : "1",
"alg" : "ECDH-ES",
}
]
},
"authorization_encrypted_response_alg": "ECDH-ES",
"authorization_encrypted_response_enc": "A128GCM"
}
}
আপনি Google Wallet-এ সঞ্চিত যেকোন পরিচয় শংসাপত্র থেকে যেকোন সংখ্যক সমর্থিত বৈশিষ্ট্যের জন্য অনুরোধ করতে পারেন।
অ্যাপে
আপনার অ্যান্ড্রয়েড অ্যাপ থেকে পরিচয় শংসাপত্রের অনুরোধ করতে এই পদক্ষেপগুলি অনুসরণ করুন:
নির্ভরতা আপডেট করুন
আপনার প্রকল্পের build.gradle-এ, ক্রেডেনশিয়াল ম্যানেজার (বিটা) ব্যবহার করতে আপনার নির্ভরতা আপডেট করুন:
dependencies {
implementation("androidx.credentials:credentials:1.5.0-beta01")
// optional - needed for credentials support from play services, for devices running Android 13 and below.
implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}
ক্রেডেনশিয়াল ম্যানেজার কনফিগার করুন
একটি CredentialManager
অবজেক্ট কনফিগার এবং আরম্ভ করতে, নিম্নলিখিত অনুরূপ যুক্তি যোগ করুন:
// Use your app or activity context to instantiate a client instance of CredentialManager.
val credentialManager = CredentialManager.create(context)
আইডেন্টিটি অ্যাট্রিবিউটের জন্য অনুরোধ করুন
পরিচয়ের অনুরোধের জন্য পৃথক পরামিতি নির্দিষ্ট করার পরিবর্তে, অ্যাপটি CredentialOption-এর মধ্যে JSON স্ট্রিং হিসাবে সেগুলিকে একসাথে প্রদান করে। ক্রেডেনশিয়াল ম্যানেজার এই JSON স্ট্রিংটিকে এর বিষয়বস্তু পরীক্ষা না করেই উপলব্ধ ডিজিটাল ওয়ালেটে পাস করে। প্রতিটি ওয়ালেট তখন এর জন্য দায়ী: - পরিচয় অনুরোধ বুঝতে JSON স্ট্রিং পার্সিং। - এর সংরক্ষিত শংসাপত্রগুলির কোনটি নির্ধারণ করা, যদি থাকে, অনুরোধটি পূরণ করে৷
আমরা অংশীদারদের সার্ভারে এমনকি অ্যান্ড্রয়েড অ্যাপ ইন্টিগ্রেশনের জন্য তাদের অনুরোধ তৈরি করার পরামর্শ দিই।
আপনি GetDigitalCredentialOption()
ফাংশন কলে request
সমন্বিত অনুরোধ বিন্যাস থেকে requestJson
ব্যবহার করবেন
// The request in the JSON format to conform with
// the JSON-ified Digital Credentials 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)
)
coroutineScope.launch {
try {
val result = credentialManager.getCredential(
context = activityContext,
request = getCredRequest
)
verifyResult(result)
} catch (e : GetCredentialException) {
handleFailure(e)
}
}
যাচাই এবং প্রতিক্রিয়া যাচাই
একবার আপনি ওয়ালেট থেকে একটি প্রতিক্রিয়া ফিরে পেলে, আপনি যাচাই করবেন যে প্রতিক্রিয়াটি সফল হয়েছে কিনা এবং এতে credentialJson
প্রতিক্রিয়া রয়েছে।
// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
val credential = result.credential
when (credential) {
is DigitalCredential -> {
val responseJson = credential.credentialJson
validateResponseOnServer(responseJson) // make a server call to validate the response
}
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.
}
else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
}
}
credentialJson
প্রতিক্রিয়াতে একটি এনক্রিপ্ট করা আইডেন্টিটি টোকেন (JWT) রয়েছে, যা W3C দ্বারা সংজ্ঞায়িত করা হয়েছে। Wallet অ্যাপ এই প্রতিক্রিয়া তৈরি করার জন্য দায়ী৷
উদাহরণ:
{
"protocol" : "openid4vp",
"data" : {
<encrpted_response>
}
}
আপনি এটির সত্যতা যাচাই করতে এই প্রতিক্রিয়াটি সার্ভারে ফেরত পাঠাবেন। আপনি শংসাপত্রের প্রতিক্রিয়া যাচাই করার পদক্ষেপগুলি খুঁজে পেতে পারেন৷
ওয়েব
Chrome-এ ডিজিটাল শংসাপত্র API ব্যবহার করে পরিচয় শংসাপত্রের অনুরোধ করতে, আপনাকে ডিজিটাল শংসাপত্র API অরিজিন ট্রায়ালের জন্য সাইন আপ করতে হবে।
const credentialResponse = await navigator.credentials.get({
digital : {
requests : [
{
protocol: "openid4vp",
data: {<credential_request>} // This is an object, shouldn't be a string.
}
]
}
})
শংসাপত্রের প্রতিক্রিয়া যাচাই করতে এই এপিআই থেকে প্রতিক্রিয়া আপনার সার্ভারে ফেরত পাঠান
শংসাপত্রের প্রতিক্রিয়া যাচাই করার পদক্ষেপ
আপনার অ্যাপ বা ওয়েবসাইট থেকে এনক্রিপ্ট করা আইডেন্টিটি টোকেন পাওয়ার পরে প্রতিক্রিয়া বিশ্বাস করার আগে আপনাকে একাধিক বৈধতা করতে হবে।
ব্যক্তিগত কী ব্যবহার করে প্রতিক্রিয়া ডিক্রিপ্ট করুন
প্রথম ধাপ হল সংরক্ষিত প্রাইভেট কী ব্যবহার করে টোকেনটি ডিক্রিপ্ট করা এবং একটি প্রতিক্রিয়া JSON পাওয়া।
পাইথন উদাহরণ:
from jwcrypto import jwe, jwk # Retrieve the Private Key from Datastore reader_private_jwk = jwk.JWK.from_json(jwe_private_key_json_str) # Decrypt the JWE encrypted response from Google Wallet jwe_object = jwe.JWE() jwe_object.deserialize(encrypted_jwe_response_from_wallet) jwe_object.decrypt(reader_private_jwk) decrypted_payload_bytes = jwe_object.payload decrypted_data = json.loads(decrypted_payload_bytes)
decrypted_data
শংসাপত্র সহ একটিvp_token
JSON হবে{ "vp_token": { "cred1": "<credential_token>" } }
সেশন ট্রান্সক্রিপ্ট তৈরি করুন
পরবর্তী ধাপ হল ISO/IEC 18013-5:2021 থেকে একটি Android বা ওয়েব নির্দিষ্ট হ্যান্ডওভার স্ট্রাকচার সহ সেশন ট্রান্সক্রিপ্ট তৈরি করা:
SessionTranscript = [ null, // DeviceEngagementBytes not available null, // EReaderKeyBytes not available [ "OpenID4VPDCAPIHandover", AndroidHandoverDataBytes // BrowserHandoverDataBytes for Web ] ]
অ্যান্ড্রয়েড/ওয়েব হ্যান্ডওভার উভয়ের জন্যই আপনাকে একই নন্স ব্যবহার করতে হবে যা আপনি
credential_request
তৈরি করতে ব্যবহার করেছিলেন।অ্যান্ড্রয়েড হ্যান্ডওভার
AndroidHandoverData = [ origin, // "android:apk-key-hash:<base64SHA256_ofAppSigningCert>", clientId, // "android-origin:<app_package_name>", nonce, // nonce that was used to generate credential request ] AndroidHandoverDataBytes = hashlib.sha256(cbor2.dumps(AndroidHandoverData)).digest()
ব্রাউজার হস্তান্তর
BrowserHandoverData =[ origin, // Origin URL clientId, // "web-origin:<origin>" nonce, // nonce that was used to generate credential request ] BrowserHandoverDataBytes = hashlib.sha256(cbor2.dumps(BrowserHandoverData)).digest()
SessionTranscript
ব্যবহার করে ডিভাইসের প্রতিক্রিয়া অবশ্যই ISO/IEC 18013-5:2021 ধারা 9 অনুযায়ী যাচাই করা উচিত। এতে বেশ কয়েকটি ধাপ রয়েছে, যেমন:রাজ্য ইস্যুকারী শংসাপত্র পরীক্ষা করুন। সমর্থিত ইস্যুকারীর IACA শংসাপত্রগুলি পরীক্ষা করুন৷
MSO স্বাক্ষর যাচাই করুন (18013-5 বিভাগ 9.1.2)
ডেটা উপাদানগুলির জন্য মান ডাইজেস্ট গণনা করুন এবং পরীক্ষা করুন (18013-5 বিভাগ 9.1.2)
deviceSignature
স্বাক্ষর স্বাক্ষর যাচাই করুন (18013-5 বিভাগ 9.1.3)
{
"version": "1.0",
"documents": [
{
"docType": "org.iso.18013.5.1.mDL",
"issuerSigned": {
"nameSpaces": {...}, // contains data elements
"issuerAuth": [...] // COSE_Sign1 w/ issuer PK, mso + sig
},
"deviceSigned": {
"nameSpaces": 24(<< {} >>), // empty
"deviceAuth": {
"deviceSignature": [...] // COSE_Sign1 w/ device signature
}
}
}
],
"status": 0
}
আপনার সমাধান পরীক্ষা করুন
আপনার সমাধান পরীক্ষা করতে, আমাদের ওপেন সোর্স রেফারেন্স হোল্ডার অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করুন এবং চালান। এখানে রেফারেন্স হোল্ডার অ্যাপ তৈরি এবং চালানোর ধাপগুলি রয়েছে:
- রেফারেন্স অ্যাপস সংগ্রহস্থল ক্লোন করুন
- অ্যান্ড্রয়েড স্টুডিওতে প্রকল্পটি খুলুন
- আপনার অ্যান্ড্রয়েড ডিভাইস বা এমুলেটরে
appholder
টার্গেট তৈরি করুন এবং চালান।
জিরো নলেজ প্রুফ (ZKP) ভিত্তিক যাচাইকরণ
জিরো-নলেজ প্রুফ (ZKP) হল একটি ক্রিপ্টোগ্রাফিক পদ্ধতি যা একজন ব্যক্তিকে (প্রবক্তা) একজন যাচাইকারীর কাছে প্রমাণ করতে দেয় যে তাদের কাছে একটি নির্দিষ্ট তথ্যের অংশ রয়েছে বা একটি নির্দিষ্ট মানদণ্ড পূরণ করে (যেমন, 18 বছরের বেশি বয়সী, একটি বৈধ প্রমাণপত্র ধারণ করে) প্রকৃত অন্তর্নিহিত ডেটা প্রকাশ না করে। মূলত, এটি সংবেদনশীল বিশদগুলি গোপন রেখে নিজের পরিচয় সম্পর্কে একটি বিবৃতির সত্যতা নিশ্চিত করার একটি উপায়।
ডিজিট্যাল আইডেন্টিটি সিস্টেমগুলি যেগুলি পরিচয় ডেটা সরাসরি ভাগ করে নেওয়ার উপর নির্ভর করে প্রায়ই ব্যবহারকারীদের অতিরিক্ত ব্যক্তিগত তথ্য ভাগ করে নেওয়ার প্রয়োজন হয়, ডেটা লঙ্ঘন এবং পরিচয় চুরির ঝুঁকি বাড়ায়। ZKPs একটি প্যারাডাইম শিফট অফার করে, যা ন্যূনতম প্রকাশের সাথে যাচাইকরণ সক্ষম করে।
ডিজিটাল পরিচয়ে ZKP-এর মূল ধারণা:
- প্রভার: ব্যক্তি তাদের পরিচয়ের একটি দিক প্রমাণ করার চেষ্টা করছে।
- যাচাইকারী: একটি পরিচয় বৈশিষ্ট্যের প্রমাণের অনুরোধকারী সত্তা।
- প্রুফ: একটি ক্রিপ্টোগ্রাফিক প্রোটোকল যা প্রমাণকারীকে গোপন তথ্য প্রকাশ না করে তাদের দাবির সত্যতা যাচাইকারীকে বোঝাতে দেয়।
শূন্য-জ্ঞান প্রমাণের মূল বৈশিষ্ট্য:
- সম্পূর্ণতা: বিবৃতিটি সত্য হলে এবং প্রমাণকারী এবং যাচাইকারী উভয়ই সৎ হলে যাচাইকারী নিশ্চিত হবেন।
- সুষ্ঠুতা: যদি বিবৃতিটি মিথ্যা হয়, তাহলে একজন অসৎ প্রবক্তা (খুব উচ্চ সম্ভাবনার সাথে) একজন সৎ যাচাইকারীকে বিশ্বাস করতে পারে না যে এটি সত্য।
- শূন্য-জ্ঞান: বিবৃতি সত্য হওয়ার বাইরে যাচাইকারী কিছুই শেখে না। প্রোভারের পরিচয় থেকে কোন প্রকৃত তথ্য প্রকাশ করা হয় না।
Google Wallet থেকে জিরো নলেজ প্রুফ ফেরত পেতে, আপনাকে অনুরোধের ফর্ম্যাটটি mso_mdoc_zk
এ পরিবর্তন করতে হবে এবং আপনার অনুরোধে zk_system_type
যোগ করতে হবে
...
"dcql_query": {
"credentials": [{
"id": "cred1",
"format": "mso_mdoc_zk",
"meta": {
"doctype_value": "org.iso.18013.5.1.mDL"
"zk_system_type": [
{
"system": "longfellow-libzk-v1",
"circuit_hash": "2093f64f54c81fb2f7f96a46593951d04005784da3d479e4543e2190dcf205d6", //This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 2
},
{
"system": "longfellow-libzk-v1",
"circuit_hash": "2836f0df5b7c2c431be21411831f8b3d2b7694b025a9d56a25086276161f7a93", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 1
}
],
"verifier_message": "challenge"
},
"claims": [{
...