এই নির্দেশিকায় ব্যাখ্যা করা হয়েছে কিভাবে রিলায়িং পার্টি (আরপি)-রা প্রযুক্তিগতভাবে ডিজিটাল ক্রেডেনশিয়ালস এপিআই সংহত করতে পারে, যার মাধ্যমে অ্যান্ড্রয়েড অ্যাপ এবং ওয়েব জুড়ে গুগল ওয়ালেট থেকে মোবাইল ড্রাইভার্স লাইসেন্স (এমডিএল) এবং আইডি পাস অনুরোধ ও যাচাই করা যায়।
নিবন্ধন প্রক্রিয়া ও পূর্বশর্তসমূহ
প্রোডাকশনে লাইভ করার আগে, আপনাকে অবশ্যই গুগলের কাছে আপনার রিলায়িং পার্টি অ্যাপ্লিকেশনটি আনুষ্ঠানিকভাবে নিবন্ধন করতে হবে।
- স্যান্ডবক্সে পরীক্ষা: আপনি আমাদের স্যান্ডবক্স এনভায়রনমেন্ট ব্যবহার করে এবং একটি টেস্ট আইডি তৈরি করে অবিলম্বে ডেভেলপমেন্ট শুরু করতে পারেন। পরীক্ষার জন্য পরিষেবার শর্তাবলী গ্রহণ করার প্রয়োজন নেই।
- ইনটেক ফর্ম জমা দিন: আরপি অনবোর্ডিং ফর্মটি পূরণ করুন। অনবোর্ডিং-এ সাধারণত ৩-৫ কার্যদিবস সময় লাগে। ব্যবহারকারীদের ডেটা কে অনুরোধ করছে তা শনাক্ত করতে সাহায্য করার জন্য, ব্যবহারকারীর সম্মতি স্ক্রিনে আপনার পণ্যের নাম এবং লোগো প্রদর্শিত হবে।
- পরিষেবার শর্তাবলী গ্রহণ করুন: লাইভ হওয়ার আগে আপনাকে অবশ্যই পরিষেবার শর্তাবলীতে স্বাক্ষর করতে হবে।
সমর্থিত ফরম্যাট এবং সক্ষমতা
গুগল ওয়ালেট ISO mdoc ভিত্তিক ডিজিটাল আইডি সমর্থন করে।
- সমর্থিত ক্রেডেনশিয়াল: আপনি সমর্থিত ক্রেডেনশিয়াল এবং অ্যাট্রিবিউটগুলো দেখে নিতে পারেন।
- সমর্থিত প্রোটোকল: OpenID4VP (সংস্করণ 1.0) ।
- ন্যূনতম অ্যান্ড্রয়েড এসডিকে: অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) এবং উচ্চতর সংস্করণ।
- ব্রাউজার সমর্থন: ডিজিটাল ক্রেডেনশিয়ালস এপিআই সমর্থন করে এমন ব্রাউজারগুলির একটি বিশদ তালিকার জন্য, ইকোসিস্টেম সাপোর্ট পৃষ্ঠাটি দেখুন।
অনুরোধটি ফরম্যাট করুন
যেকোনো ওয়ালেট থেকে ক্রেডেনশিয়াল অনুরোধ করতে, আপনাকে অবশ্যই OpenID4VP ব্যবহার করে আপনার অনুরোধটি ফরম্যাট করতে হবে। আপনি একটিমাত্র dcql_query অবজেক্টে নির্দিষ্ট ক্রেডেনশিয়াল অথবা একাধিক ক্রেডেনশিয়াল অনুরোধ করতে পারেন।
JSON অনুরোধের উদাহরণ
অ্যান্ড্রয়েড ডিভাইস বা ওয়েবে থাকা যেকোনো ওয়ালেট থেকে পরিচয়পত্র পাওয়ার জন্য একটি mdoc requestJson অনুরোধের নমুনা এখানে দেওয়া হলো।
{
"requests" : [
{
"protocol": "openid4vp-v1-signed",
"data": {<signed_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", // change this to dc_api if you want to demo with a non encrypted response.
"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"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.18013.5.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.18013.5.1",
"age_over_18"
],
"intent_to_retain": false
}
]
}
]
},
"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", // This is required
"alg" : "ECDH-ES", // This is required
}
]
},
"vp_formats_supported": {
"mso_mdoc": {
"deviceauth_alg_values": [
-7
],
"isserauth_alg_values": [
-7
]
}
}
}
}
যেকোনো যোগ্য শংসাপত্র
এখানে mDL এবং ID পাস উভয়ের জন্য অনুরোধের একটি নমুনা দেওয়া হলো। ব্যবহারকারী যেকোনো একটি দিয়ে অগ্রসর হতে পারেন।
{
"response_type": "vp_token",
"response_mode": "dc_api.jwt", // change this to dc_api if you want to demo with a non encrypted response.
"nonce": "1234",
"dcql_query": {
"credentials": [
{
"id": "mdl-request",
"format": "mso_mdoc",
"meta": {
"doctype_value": "org.iso.18013.5.1.mDL"
},
"claims": [
{
"path": [
"org.iso.18013.5.1",
"family_name"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.18013.5.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.18013.5.1",
"age_over_18"
],
"intent_to_retain": false
}
]
},
{ // Credential type 2
"id": "id_pass-request",
"format": "mso_mdoc",
"meta": {
"doctype_value": "com.google.wallet.idcard.1"
},
"claims": [
{
"path": [
"org.iso.18013.5.1",
"family_name"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.18013.5.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.18013.5.1",
"age_over_18"
],
"intent_to_retain": false
}
]
}
]
credential_sets : [
{
"options": [
[ "mdl-request" ],
[ "id_pass-request" ]
]
}
]
},
"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", // This is required
"alg" : "ECDH-ES", // This is required
}
]
},
"vp_formats_supported": {
"mso_mdoc": {
"deviceauth_alg_values": [
-7
],
"isserauth_alg_values": [
-7
]
}
}
}
}
আপনি গুগল ওয়ালেটে সংরক্ষিত যেকোনো পরিচয়পত্র থেকে যেকোনো সংখ্যক সমর্থিত বৈশিষ্ট্যের জন্য অনুরোধ করতে পারেন।
স্বাক্ষরিত অনুরোধ
স্বাক্ষরিত অনুরোধ (JWT সুরক্ষিত অনুমোদন অনুরোধ) আপনার PKI পরিকাঠামো ব্যবহার করে আপনার যাচাইযোগ্য উপস্থাপনার অনুরোধকে একটি ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত JSON ওয়েব টোকেন (JWT)-এর মধ্যে আবদ্ধ করে, যা অনুরোধের অখণ্ডতা নিশ্চিত করে এবং Google Wallet-এর কাছে আপনার পরিচয় প্রমাণ করে।
পূর্বশর্ত
স্বাক্ষরিত অনুরোধের জন্য কোড পরিবর্তনগুলি প্রয়োগ করার আগে, নিশ্চিত করুন যে আপনার কাছে নিম্নলিখিতগুলি রয়েছে:
- প্রাইভেট কী: অনুরোধটি স্বাক্ষর করার জন্য আপনার একটি প্রাইভেট কী (যেমন, এলিপটিক কার্ভ
ES256) প্রয়োজন, যা আপনার সার্ভারে পরিচালিত হয়। - সার্টিফিকেট: আপনার কী পেয়ার থেকে প্রাপ্ত একটি স্ট্যান্ডার্ড X.509 সার্টিফিকেট প্রয়োজন।
- নিবন্ধন: আপনার পাবলিক সার্টিফিকেটটি গুগল ওয়ালেটে নিবন্ধিত আছে কিনা তা নিশ্চিত করুন। আমাদের সাপোর্ট টিমের সাথে
wallet-identity-rp-support@google.comএই ঠিকানায় যোগাযোগ করুন।
অনুরোধ নির্মাণ যুক্তি
একটি অনুরোধ তৈরি করতে আপনাকে আপনার প্রাইভেট কী ব্যবহার করতে হবে এবং পেলোডটিকে একটি JWS-এর মধ্যে রাখতে হবে।
def construct_openid4vp_request(
doctypes: list[str],
requested_fields: list[dict],
nonce_base64: str,
jwe_encryption_public_jwk: jwk.JWK,
is_zkp_request: bool,
is_signed_request: bool,
state: dict,
origin: str
) -> dict:
# ... [Existing logic to build 'presentation_definition' and basic 'request_payload'] ...
# ------------------------------------------------------------------
# SIGNED REQUEST IMPLEMENTATION (JAR)
# ------------------------------------------------------------------
if is_signed_request:
try:
# 1. Load the Verifier's Certificate
# We must load the PEM string into a cryptography x509 object
verifier_cert_obj = x509.load_pem_x509_certificate(
CERTIFICATE.encode('utf-8'),
backend=default_backend()
)
# 2. Calculate Client ID (x509_hash)
# We calculate the SHA-256 hash of the DER-encoded certificate.
cert_der = verifier_cert_obj.public_bytes(serialization.Encoding.DER)
verifier_fingerprint_bytes = hashlib.sha256(cert_der).digest()
# Create a URL-safe Base64 hash (removing padding '=')
verifier_fingerprint_b64 = base64.urlsafe_b64encode(verifier_fingerprint_bytes).decode('utf-8').rstrip("=")
# Format the client_id as required by the spec
client_id = f'x509_hash:{verifier_fingerprint_b64}'
# 3. Update Request Payload with JAR specific fields
request_payload["client_id"] = client_id
# Explicitly set expected origins to prevent relay attacks
# Format for android origin: origin = android:apk-key-hash:<base64SHA256_ofAppSigningCert>
# Format for web origin: origin = <origin_url>
if origin:
request_payload["expected_origins"] = [origin]
# 4. Create Signed JWT (JWS)
# Load the signing private key
signing_key = jwk.JWK.from_pem(PRIVATE_KEY.encode('utf-8'))
# Initialize JWS with the JSON payload
jws_token = jws.JWS(json.dumps(request_payload).encode('utf-8'))
# Construct the JOSE Header
# 'x5c' (X.509 Certificate Chain) is critical: it allows the wallet
# to validate your key against the one registered in the console.
x5c_value = base64.b64encode(cert_der).decode('utf-8')
protected_header = {
"alg": "ES256", # Algorithm (e.g., ES256 or RS256)
"typ": "oauth-authz-req+jwt", # Standard type for JAR
"kid": "1", # Key ID
"x5c": [x5c_value] # Embed the certificate
}
# Sign the token
jws_token.add_signature(
key=signing_key,
alg=None,
protected=json_encode(protected_header)
)
# 5. Return the Request Object
# Instead of returning the raw JSON, we return the signed JWT string
# under the 'request' key.
return {"request": jws_token.serialize(compact=True)}
except Exception as e:
print(f"Error signing OpenID4VP request: {e}")
return None
# ... [Fallback for unsigned requests] ...
return request_payload
এপিআই ট্রিগার করুন
সম্পূর্ণ এপিআই অনুরোধটি সার্ভার-সাইডে তৈরি করা উচিত। প্ল্যাটফর্মের ওপর নির্ভর করে, আপনি তৈরি করা JSON ডেটা নেটিভ এপিআইগুলোতে পাঠাবেন।
অ্যাপের মধ্যে (অ্যান্ড্রয়েড)
আপনার অ্যান্ড্রয়েড অ্যাপগুলো থেকে পরিচয়পত্র অনুরোধ করতে, এই ধাপগুলো অনুসরণ করুন:
নির্ভরতা আপডেট করুন
আপনার প্রোজেক্টের build.gradle ফাইলে, Credential Manager (beta) ব্যবহার করার জন্য আপনার ডিপেন্ডেন্সিগুলো আপডেট করুন:
dependencies {
implementation("androidx.credentials:credentials:1.5.0-beta01")
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 স্ট্রিং হিসেবে প্রদান করে। Credential Manager এই JSON স্ট্রিংটির বিষয়বস্তু পরীক্ষা না করেই উপলব্ধ ডিজিটাল ওয়ালেটগুলোতে পাঠিয়ে দেয়। এরপর প্রতিটি ওয়ালেট নিম্নলিখিত কাজগুলোর জন্য দায়ী থাকে: - পরিচয় অনুরোধটি বোঝার জন্য JSON স্ট্রিংটি পার্স করা। - তার সংরক্ষিত ক্রেডেনশিয়ালগুলোর মধ্যে কোনটি (যদি থাকে) অনুরোধটি পূরণ করতে পারে, তা নির্ধারণ করা।
আমরা অংশীদারদেরকে, এমনকি অ্যান্ড্রয়েড অ্যাপ ইন্টিগ্রেশনের জন্যও, সার্ভারে তাদের অনুরোধ তৈরি করার পরামর্শ দিই।
আপনি GetDigitalCredentialOption() ফাংশন কলে request হিসেবে Request Format থেকে 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 রেসপন্সটিতে W3C দ্বারা সংজ্ঞায়িত একটি এনক্রিপ্টেড আইডেন্টিটি টোকেন (JWT) থাকে। এই রেসপন্সটি তৈরি করার দায়িত্ব ওয়ালেট অ্যাপের।
উদাহরণ:
{
"protocol" : "openid4vp-v1-signed",
"data" : {
<encrpted_response>
}
}
এর সত্যতা যাচাই করার জন্য আপনি এই প্রতিক্রিয়াটি সার্ভারে ফেরত পাঠাবেন। ক্রেডেনশিয়াল প্রতিক্রিয়া যাচাই করার ধাপগুলো আপনি এখানে খুঁজে পেতে পারেন।
ওয়েব
Chrome বা অন্যান্য সমর্থিত ব্রাউজারে Digital Credentials API ব্যবহার করে পরিচয়পত্র অনুরোধ করতে, নিম্নলিখিত অনুরোধটি করুন।
const credentialResponse = await navigator.credentials.get({
digital : {
requests : [
{
protocol: "openid4vp-v1-signed",
data: {<credential_request>} // This is an object, shouldn't be a string.
}
]
}
})
ক্রেডেনশিয়াল রেসপন্স যাচাই করার জন্য এই এপিআই থেকে প্রাপ্ত রেসপন্সটি আপনার সার্ভারে ফেরত পাঠান।
প্রতিক্রিয়া যাচাই করুন
একবার ওয়ালেটটি এনক্রিপ্টেড identityToken (JWT) ফেরত দিলে, ডেটাটি বিশ্বাস করার আগে আপনাকে অবশ্যই কঠোর সার্ভার-সাইড যাচাইকরণ করতে হবে।
প্রতিক্রিয়াটি ডিক্রিপ্ট করুন
অনুরোধের client_metadata তে পাঠানো পাবলিক কী-এর সাথে সঙ্গতিপূর্ণ প্রাইভেট কী ব্যবহার করে JWE-টি ডিক্রিপ্ট করুন। এর ফলে একটি vp_token পাওয়া যাবে।
পাইথন উদাহরণ:
from jwcrypto import jwe, jwk
# Retrieve the Private Key from Datastore
reader_private_jwk = jwk.JWK.from_json(jwe_private_key_json_str)
# Save public key thumbprint for session transcript
encryption_public_jwk_thumbprint = reader_private_jwk.thumbprint()
# 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": ["<base64UrlNoPadding_encoded_credential>"] // This applies to OpenID4VP 1.0 spec.
}
}
সেশন ট্রান্সক্রিপ্ট তৈরি করুন
পরবর্তী ধাপ হলো ISO/IEC 18013-5:2021 অনুযায়ী অ্যান্ড্রয়েড বা ওয়েব-নির্দিষ্ট হ্যান্ডওভার কাঠামো ব্যবহার করে সেশন ট্রান্সক্রিপ্ট তৈরি করা:
SessionTranscript = [ null, // DeviceEngagementBytes not available null, // EReaderKeyBytes not available [ "OpenID4VPDCAPIHandover", AndroidHandoverDataBytes // BrowserHandoverDataBytes for Web ] ]অ্যান্ড্রয়েড এবং ওয়েব হ্যান্ডওভার উভয়ের জন্যই, আপনাকে সেই একই ননস (nonce) ব্যবহার করতে হবে যা আপনি
credential_request) তৈরি করতে ব্যবহার করেছিলেন।অ্যান্ড্রয়েড হস্তান্তর
AndroidHandoverData = [ origin, // "android:apk-key-hash:<base64SHA256_ofAppSigningCert>", nonce, // nonce that was used to generate credential request, encryption_public_jwk_thumbprint, // Encryption public key (JWK) Thumbprint ] AndroidHandoverDataBytes = hashlib.sha256(cbor2.dumps(AndroidHandoverData)).digest()
ব্রাউজার হস্তান্তর
BrowserHandoverData =[ origin, // Origin URL nonce, // nonce that was used to generate credential request encryption_public_jwk_thumbprint, // Encryption public key (JWK) Thumbprint ] BrowserHandoverDataBytes = hashlib.sha256(cbor2.dumps(BrowserHandoverData)).digest()
SessionTranscriptব্যবহার করে, ISO/IEC 18013-5:2021 এর ধারা ৯ অনুযায়ী ডিভাইস রেসপন্স অবশ্যই যাচাই করতে হবে। এর মধ্যে কয়েকটি ধাপ অন্তর্ভুক্ত, যেমন:রাজ্য ইস্যুকারী সার্টিফিকেট যাচাই করুন। সমর্থিত ইস্যুকারীর IACA সার্টিফিকেটগুলো দেখুন।
MSO স্বাক্ষর যাচাই করুন (18013-5 ধারা 9.1.2)
ডেটা এলিমেন্টগুলোর জন্য
ValueDigestsগণনা ও যাচাই করুন (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
}
গোপনীয়তা-সংরক্ষণকারী বয়স যাচাইকরণ (ZKP)
জিরো-নলেজ প্রুফ সমর্থন করার জন্য (যেমন, কোনো ব্যবহারকারীর সঠিক জন্মতারিখ না দেখেই তার বয়স ১৮ বছরের বেশি কিনা তা যাচাই করা), আপনার রিকোয়েস্ট ফরম্যাটটি 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": "f88a39e561ec0be02bb3dfe38fb609ad154e98decbbe632887d850fc612fea6f", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 5,
"block_enc_hash": 4096,
"block_enc_sig": 2945,
}
{
"system": "longfellow-libzk-v1",
"circuit_hash": "137e5a75ce72735a37c8a72da1a8a0a5df8d13365c2ae3d2c2bd6a0e7197c7c6", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 6,
"block_enc_hash": 4096,
"block_enc_sig": 2945,
}
],
"verifier_message": "challenge"
},
"claims": [{
...
"client_metadata": {
"jwks": {
"keys": [ // sample request encryption key
{
...
আপনি ওয়ালেট থেকে একটি এনক্রিপ্টেড জিরো নলেজ প্রুফ ফেরত পাবেন। আপনি গুগলের longfellow-zk লাইব্রেরি ব্যবহার করে ইস্যুকারীর IACA সার্টিফিকেটের সাথে এই প্রুফটি যাচাই করতে পারবেন।
ভেরিফায়ার-সার্ভিসটিতে একটি ডেপ্লয়মেন্টের জন্য প্রস্তুত, ডকার-ভিত্তিক সার্ভার রয়েছে যা আপনাকে নির্দিষ্ট ইস্যুকারী IACA সার্টিফিকেটের বিপরীতে রেসপন্সটি যাচাই করতে দেয়।
আপনি certs.pem ফাইলটি পরিবর্তন করে আপনার বিশ্বাসযোগ্য IACA ইস্যুকারী সার্টিফিকেটগুলো পরিচালনা করতে পারেন।
সম্পদ ও সহায়তা
- রেফারেন্স ইমপ্লিমেন্টেশন: গিটহাবে আমাদের আইডেন্টিটি ভেরিফায়ার্স রেফারেন্স ইমপ্লিমেন্টেশনটি দেখে নিন।
- পরীক্ষামূলক ওয়েবসাইট: verifier.multipaz.org- এ সম্পূর্ণ কার্যপ্রবাহটি পরখ করে দেখুন।
- OpenID4VP স্পেক: OpenID4VP- এর প্রযুক্তিগত বিবরণ দেখে নিন।
- সহায়তা: ইন্টিগ্রেশন চলাকালীন ডিবাগিং সহায়তা বা কোনো প্রশ্নের জন্য
wallet-identity-rp-support@google.comএ যোগাযোগ করুন।