डिजिटल आईडी को ऐप्लिकेशन में और वेब, दोनों फ़्लो में स्वीकार किया जा सकता है. Google Wallet से क्रेडेंशियल स्वीकार करने के लिए, आपको ये काम करने होंगे:
- दिए गए निर्देशों का पालन करके, ऐप्लिकेशन या वेब का इस्तेमाल करके इंटिग्रेट करें.
- Google Wallet के सैंडबॉक्स का इस्तेमाल करके, अपने फ़्लो की जांच करने के लिए टेस्ट आईडी का इस्तेमाल करें.
- लाइव होने के लिए, ऐक्सेस का अनुरोध करने के लिए यह फ़ॉर्म भरें. साथ ही, Google Wallet क्रेडेंशियल की सेवा की शर्तें स्वीकार करें. आपको अपनी हर कारोबारी इकाई के लिए यह फ़ॉर्म भरना होगा. फ़ॉर्म भरने के बाद, हमारी टीम आपसे संपर्क करेगी.
- अगर आपका कोई सवाल है, तो
wallet-identity-rp-support@google.com
से संपर्क करें.
क्रेडेंशियल के ऐसे फ़ॉर्मैट जिनका इस्तेमाल किया जा सकता है
डिजिटल पहचान से जुड़े दस्तावेज़ों के डेटा फ़ॉर्मैट के लिए, कई स्टैंडर्ड सुझाए गए हैं. इनमें से दो स्टैंडर्ड, इंडस्ट्री में काफ़ी लोकप्रिय हैं:
- mdocs - ISO के मुताबिक तय किया गया.
- w3c Verifiable Credentials - इन्हें w3c ने तय किया है.
Android Credential Manager, दोनों फ़ॉर्मैट के साथ काम करता है. हालांकि, फ़िलहाल Google Wallet में सिर्फ़ एमडॉक पर आधारित डिजिटल आईडी इस्तेमाल किए जा सकते हैं.
इन क्रेडेंशियल का इस्तेमाल किया जा सकता है
Google Wallet में दो तरह के क्रेडेंशियल इस्तेमाल किए जा सकते हैं:
- मोबाइल ड्राइविंग लाइसेंस (एमडीएल)
- आईडी पास
एक पैरामीटर में बदलाव करके, अपने फ़्लो में किसी भी क्रेडेंशियल का अनुरोध किया जा सकता है.
उपयोगकर्ता अनुभव
इस सेक्शन में, ऑनलाइन प्रज़ेंटेशन के लिए सुझाए गए फ़्लो के बारे में बताया गया है. इस फ़्लो में, शराब की डिलीवरी करने वाले ऐप्लिकेशन को उम्र की जानकारी देने का तरीका दिखाया गया है. हालांकि, वेब के साथ-साथ अन्य तरह के प्रज़ेंटेशन के लिए भी यूज़र एक्सपीरियंस एक जैसा होता है.
![]() |
![]() |
![]() |
![]() |
![]() |
उपयोगकर्ता को ऐप्लिकेशन या वेबसाइट पर उम्र की पुष्टि करने के लिए कहा गया | उपयोगकर्ता को ज़रूरी शर्तें पूरी करने वाले उपलब्ध क्रेडेंशियल दिखते हैं | उपयोगकर्ता को Google Wallet में पुष्टि करने वाला पेज दिखता है | उपयोगकर्ता, ऐक्सेस शेयर करने की पुष्टि करता है | ऐप्लिकेशन या वेबसाइट को भेजा गया डेटा |
अहम जानकारी
- ऐप्लिकेशन या वेबसाइट के पास, एपीआई के एंट्री पॉइंट को बनाने के तरीके में बदलाव करने का विकल्प होता है. पहले चरण में दिखाए गए तरीके के मुताबिक, हमारा सुझाव है कि आप "डिजिटल आईडी से पुष्टि करें" जैसे सामान्य बटन दिखाएं. इसकी वजह यह है कि आने वाले समय में, हमें उम्मीद है कि API के ज़रिए Google Wallet के अलावा अन्य विकल्प भी उपलब्ध होंगे.
- दूसरे चरण में, चुनने के लिए उपलब्ध विकल्पों वाली स्क्रीन को Android रेंडर करता है. ज़रूरी क्रेडेंशियल का फ़ैसला, हर Wallet के दिए गए रजिस्ट्रेशन लॉजिक और पुष्टि करने वाली पार्टी के भेजे गए अनुरोध के मिलान के आधार पर किया जाता है
- तीसरा चरण, Google Wallet की मदद से पूरा किया जाता है. Google Wallet, इस स्क्रीन पर डेवलपर की ओर से दिए गए नाम, लोगो, और निजता नीति को दिखाएगा.
डिजिटल आईडी फ़्लो जोड़ना
अगर उपयोगकर्ता के पास क्रेडेंशियल नहीं है, तो हमारा सुझाव है कि "डिजिटल आईडी से पुष्टि करें" बटन के बगल में एक लिंक दें. इससे उपयोगकर्ता को Google Wallet पर रीडायरेक्ट किया जाएगा, ताकि वह डिजिटल आईडी जोड़ सके.
![]() |
![]() |
उपयोगकर्ता को ऐप्लिकेशन या वेबसाइट पर उम्र की पुष्टि करने के लिए कहा गया | उपयोगकर्ता को डिजिटल आईडी पाने के लिए Google Wallet पर ले जाया गया |
कोई डिजिटल आईडी उपलब्ध नहीं है
अगर उपयोगकर्ता के पास डिजिटल आईडी नहीं है और वह "डिजिटल आईडी से पुष्टि करें" विकल्प चुनता है, तो उसे यह गड़बड़ी का मैसेज दिखेगा.
![]() |
![]() |
उपयोगकर्ता को ऐप्लिकेशन या वेबसाइट पर उम्र की पुष्टि करने के लिए कहा गया | अगर उपयोगकर्ता के पास डिजिटल आईडी नहीं है, तो उसे गड़बड़ी का मैसेज दिखाया जाता है |
यह एपीआई, उपयोगकर्ता की निजता बनाए रखने के लिए, यह पता लगाने की सुविधा के साथ काम नहीं करता कि उपयोगकर्ता के पास कोई डिजिटल आईडी उपलब्ध है या नहीं. इसलिए, हमारा सुझाव है कि आप ऑनबोर्डिंग लिंक का विकल्प शामिल करें.
वॉलेट से आईडी क्रेडेंशियल का अनुरोध करने के लिए फ़ॉर्मैट
यहां Android डिवाइस या वेब पर किसी भी वॉलेट से पहचान के क्रेडेंशियल पाने के लिए, एमडॉक requestJson
अनुरोध का एक सैंपल दिया गया है.
{
"requests" : [
{
"protocol": "openid4vp",
"data": {<credential_request>} // This is an object, shouldn't be a string.
}
]
}
एन्क्रिप्ट (सुरक्षित) करने का अनुरोध करना
client_metadata
में, हर अनुरोध के लिए एन्क्रिप्शन की सार्वजनिक कुंजी होती है.
आपको हर अनुरोध के लिए निजी कुंजियां सेव करनी होंगी. साथ ही, इनका इस्तेमाल Wallet ऐप्लिकेशन से मिले टोकन की पुष्टि करने और उसे अनुमति देने के लिए करना होगा.
requestJson
में मौजूद credential_request
पैरामीटर में ये फ़ील्ड शामिल होंगे.
{
"response_type": "vp_token",
"response_mode": "dc_api",
"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",
"alg" : "ECDH-ES",
}
]
},
"authorization_encrypted_response_alg": "ECDH-ES",
"authorization_encrypted_response_enc": "A128GCM"
}
}
Google Wallet में सेव किए गए किसी भी पहचान के दस्तावेज़ से, काम करने वाले किसी भी एट्रिब्यूट के लिए अनुरोध किया जा सकता है.
ऐप्लिकेशन में
अपने Android ऐप्लिकेशन से पहचान की पुष्टि करने वाले क्रेडेंशियल का अनुरोध करने के लिए, यह तरीका अपनाएं:
डिपेंडेंसी अपडेट करना
अपने प्रोजेक्ट की build.gradle फ़ाइल में, Credential Manager (बीटा वर्शन) का इस्तेमाल करने के लिए, अपनी डिपेंडेंसी अपडेट करें:
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 स्ट्रिंग को पार्स करना. - यह तय करना कि सेव किए गए क्रेडेंशियल में से कौनसे क्रेडेंशियल, अनुरोध को पूरा करते हैं.
हमारा सुझाव है कि पार्टनर, Android ऐप्लिकेशन इंटिग्रेशन के लिए भी सर्वर पर अनुरोध बनाएं.
आपको अनुरोध फ़ॉर्मैट से requestJson
का इस्तेमाल करना होगा. इसमें GetDigitalCredentialOption()
फ़ंक्शन कॉल में request
शामिल है
// 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
रिस्पॉन्स में, एन्क्रिप्ट (सुरक्षित) किया गया identityToken (JWT) शामिल होता है. इसे W3C ने तय किया है. इस जवाब को जनरेट करने की ज़िम्मेदारी Wallet ऐप्लिकेशन की है.
उदाहरण:
{
"protocol" : "openid4vp",
"data" : {
<encrpted_response>
}
}
आपको इस जवाब को वापस सर्वर पर भेजना होगा, ताकि यह पुष्टि की जा सके कि यह जवाब असली है. क्रेडेंशियल के जवाब की पुष्टि करने का तरीका जानें.
वेब
Chrome पर Digital Credentials API का इस्तेमाल करके, पहचान से जुड़े क्रेडेंशियल का अनुरोध करने के लिए, आपको Digital Credentials API के ऑरिजिन ट्रायल के लिए साइन अप करना होगा.
const credentialResponse = await navigator.credentials.get({
digital : {
requests : [
{
protocol: "openid4vp",
data: {<credential_request>} // This is an object, shouldn't be a string.
}
]
}
})
इस एपीआई से मिले जवाब को अपने सर्वर पर वापस भेजें, ताकि क्रेडेंशियल के जवाब की पुष्टि की जा सके
क्रेडेंशियल के जवाब की पुष्टि करने का तरीका
आपके ऐप्लिकेशन या वेबसाइट से एन्क्रिप्ट (सुरक्षित) किया गया identityToken मिलने पर, आपको जवाब पर भरोसा करने से पहले कई तरह की पुष्टि करनी होगी.
निजी पासकोड का इस्तेमाल करके जवाब को डिक्रिप्ट करना
पहला चरण, सेव की गई निजी कुंजी का इस्तेमाल करके टोकन को डिक्रिप्ट करना और जवाब के तौर पर JSON पाना है.
Python का उदाहरण:
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>" } }
सेशन की ट्रांसक्रिप्ट बनाना
अगला चरण, Android या वेब के लिए खास हैंडओवर स्ट्रक्चर के साथ ISO/IEC 18013-5:2021 से SessionTranscript बनाना है:
SessionTranscript = [ null, // DeviceEngagementBytes not available null, // EReaderKeyBytes not available [ "OpenID4VPDCAPIHandover", AndroidHandoverDataBytes // BrowserHandoverDataBytes for Web ] ]
Android और वेब, दोनों के लिए हैंडओवर करते समय, आपको उसी नॉनस का इस्तेमाल करना होगा जिसका इस्तेमाल आपने
credential_request
जनरेट करने के लिए किया था.Android हैंडओवर
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
का इस्तेमाल करके, DeviceResponse की पुष्टि ISO/IEC 18013-5:2021 के क्लॉज़ 9 के मुताबिक की जानी चाहिए. इसमें कई चरण शामिल हैं, जैसे:स्टेट इश्यूअर सर्टिफ़िकेट की जांच करें. इस तरह की सेवा देने वाले बैंक/वित्तीय संस्थान के IACA सर्टिफ़िकेट देखें
एमएसओ के हस्ताक्षर की पुष्टि करना (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
}
अपने समाधान को टेस्ट करना
अपने समाधान की जांच करने के लिए, ओपन सोर्स रेफ़रंस होल्डर Android ऐप्लिकेशन बनाएं और चलाएं. रेफ़रंस होल्डर ऐप्लिकेशन बनाने और उसे चलाने का तरीका यहां दिया गया है:
- रेफ़रंस ऐप्लिकेशन की रिपॉज़िटरी क्लोन करें
- Android Studio पर प्रोजेक्ट खोलना
- अपने Android डिवाइस या एम्युलेटर पर
appholder
टारगेट बनाएं और उसे चलाएं.
ज़ीरो नॉलेज प्रूफ़ (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": "bd3168ea0a9096b4f7b9b61d1c210dac1b7126a9ec40b8bc770d4d485efce4e9", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 3
},
{
"system": "longfellow-libzk-v1",
"circuit_hash": "89288b9aa69d2120d211618fcca8345deb4f85d2e710c220cc9c059bbee4c91f", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 4
}
],
"verifier_message": "challenge"
},
"claims": [{
...
"client_metadata": {
"jwks": {
"keys": [ // sample request encryption key
{
...
आपको वॉलेट से, एन्क्रिप्ट (सुरक्षित) किया गया ज़ीरो नॉलेज प्रूफ़ वापस मिलेगा. Google की longfellow-zk लाइब्रेरी का इस्तेमाल करके, इस सबूत की पुष्टि की जा सकती है. इसके लिए, आपको IACA सर्टिफ़िकेट जारी करने वालों के ख़िलाफ़ सबूत की पुष्टि करनी होगी.
ज़्यादा जानकारी के लिए, सहायता टीम से इस ईमेल पते पर संपर्क करें
wallet-identity-rp-support@google.com