প্রকাশিত: ২৩ অক্টোবর, ২০২৬
Chrome 155 এবং তার পরবর্তী ভার্সনে, ডিজিটাল ক্রেডেনশিয়াল API ইস্যু করার সুবিধা ডিফল্ট হিসেবে চালু করা থাকে, তাই এটি ব্যবহার করার জন্য আপনার আর কোনও অরিজিন ট্রায়াল টোকেন বা ফ্ল্যাগের প্রয়োজন নেই। Digital Credentials API হল একটি ট্রান্সপোর্ট লেয়ার যা ব্যবহারকারীর মোবাইল ডিভাইসে ইনস্টল করা ওয়ালেট অ্যাপের সাথে ওয়েবসাইটকে কানেক্ট করতে দেয়। ইস্যু করার মাধ্যমে, ইস্যুকারী সরাসরি ব্যবহারকারীর ওয়ালেট অ্যাপে নতুন ক্রেডেনশিয়াল (যেমন ডিজিটাল আইডি) যোগ করতে পারবেন।
ব্যাকগ্রাউন্ড
ডিজিটাল পরিচয় ইকোসিস্টেমে তিনটি পক্ষ থাকে: ইস্যুকারী, যাচাইকারী (যাদের নির্ভরশীল পক্ষও বলা হয়) এবং হোল্ডার (ওয়ালেট অ্যাপ)। ব্যবহারকারীরা প্রায়ই পুশ প্রভিশনিংয়ের মাধ্যমে তাদের ওয়ালেট অ্যাপে ডিজিটাল আইডি যোগ করেন, যেখানে ব্যবহারকারী ইস্যুকারীর ওয়েবসাইট বা অ্যাপ থেকে ইস্যু করার প্রসেস শুরু করেন। যেমন, কোনও স্টুডেন্ট তার বিশ্ববিদ্যালয়ের ওয়েবসাইট (ইস্যুকারী) থেকে তার ডিজিটাল স্টুডেন্ট আইডি তার পছন্দের ওয়ালেট অ্যাপে (হোল্ডার) সেভ করতে পারেন।
এই মডেলটি সফল করার জন্য, ইস্যুকারীকে আইডি ইস্যু করার জন্য Wallet অ্যাপ চালু করার একটি নিরাপদ এবং নির্ভরযোগ্য উপায় প্রয়োজন। এই API-এর আগে, প্রতিটি ইস্যুকারীকে পার্টনারশিপ করা ওয়ালেট অ্যাপ খোলার জন্য নিজস্ব উপায় তৈরি করতে হতো, সাধারণত কাস্টম URI স্কিম ব্যবহার করে। ইস্যুকারীকে প্রতিটি ওয়ালেট অ্যাপের জন্য আলাদা মেকানিজম বজায় রাখতে হত এবং ব্যবহারকারীদের কাছে ওয়ালেট অ্যাপ বেছে নেওয়ার কোনও ধারাবাহিক উপায় ছিল না।
ডিজিটাল ক্রেডেনশিয়াল ইস্যু করার প্রক্রিয়া কীভাবে কাজ করে
এই প্রসেস আরও সহজ করতে, Chrome W3C ডিজিটাল ক্রেডেনশিয়াল API-এর মাধ্যমে
ইস্যু করার প্রসেসকে সমর্থন করে। এটি
প্রেজেন্টেশন সংক্রান্ত ক্ষমতা
(শেয়ার করার অনুরোধ, যাচাইকারীর সাথে ডিজিটাল ক্রেডেনশিয়াল থেকে বেছে নেওয়া ডেটা)
বাড়িয়ে দেয়, যা Chrome 141-এ শিপ করা হয়েছে। যখন কোনও ইস্যুকারী ওয়েবসাইট
navigator.credentials.create()-কে digital মেম্বারের সাথে কল করে, যার মধ্যে
ইস্যু করার অনুরোধ থাকে, তখন Chrome অপারেটিং সিস্টেমে (Android-এ,
ক্রেডেনশিয়াল ম্যানেজার) অনুরোধটি পাস করে। তারপর অপারেটিং সিস্টেম তার নিজস্ব ইন্টারফেস দেখায় যেখানে
ব্যবহারকারী একটি ওয়ালেট অ্যাপ বেছে নেন। API শিল্পের নির্ধারিত মান প্রোটোকলের সাথে কাজ করে যেমন
যাচাইযোগ্য ক্রেডেনশিয়াল ইস্যু করার জন্য OpenID (OpenID4VCI)।
ইস্যু করার ক্ষেত্রে দুটি ফ্লো কাজ করে: Android-এ একই-ডিভাইস ফ্লো এবং ক্রস-ডিভাইস
ফ্লো যা ডেস্কটপে শুরু হয় এবং Android ডিভাইসে শেষ হয়।
Android-এ একই-ডিভাইস ফ্লো
Android-এ, Chrome ইস্যু করার অনুরোধ Android ক্রেডেনশিয়াল ম্যানেজার-এ পাস করে, যা ডিভাইসে মানানসই ওয়ালেট অ্যাপের তালিকা দেখায়। ব্যবহারকারী একটি ওয়ালেট বেছে নেন এবং ক্রেডেনশিয়াল যোগ করার জন্য সম্মতি দেন। তারপর, ওয়ালেট অ্যাপ ইস্যুকারীর থেকে ইস্যুয়েন্স প্রোটোকল ব্যবহার করে ক্রেডেনশিয়াল পায়, যেমন OpenID4VCI।
ডেস্কটপে ক্রস-ডিভাইস ফ্লো
ডেস্কটপে, Chrome একটি QR কোড দেখায়। ব্যবহারকারী তার Android ডিভাইস দিয়ে কোডটি স্ক্যান করেন এবং সেই ডিভাইসে ফ্লো সম্পূর্ণ করেন, যেমনটি আগের বিভাগে বর্ণনা করা হয়েছে। ডিভাইসগুলি একে অপরের কাছাকাছি আছে কিনা তা কনফার্ম করতে ব্লুটুথ ব্যবহার করে, তাই ব্লুটুথ বন্ধ থাকলে Chrome ব্যবহারকারীকে তা চালু করতে বলে। Chrome ডিজিটাল ক্রেডেনশিয়াল API প্রেজেন্টেশনের জন্য একই ক্রস-ডিভাইস মেকানিজম ব্যবহার করে।
API ব্যবহার করে ইস্যু করার সুবিধা প্রয়োগ করুন
ইস্যু করার ফ্লো শুরু করতে, navigator.credentials.create() কল করুন এবং আপনার
ইস্যু করার অনুরোধ digital মেম্বারের মধ্যে পাস করুন। ক্লিক হ্যান্ডলার বা অন্য কোনও ইউজার জেসচার হ্যান্ডলার থেকে এই কল করুন, কারণ কল করার জন্য ট্রানজিয়েন্ট ব্যবহারকারী অ্যাক্টিভেশন প্রয়োজন। নিম্নলিখিত উদাহরণে, আগে থেকে অনুমোদিত কোড ফ্লো সহ OpenID4VCI ক্রেডেনশিয়াল অফার ব্যবহার করা হয়েছে:
// Call this function from a user gesture handler, for example, a button's
// click handler. The pre-authorized code is a short-lived, single-use code
// that your server generates for the signed-in user.
async function issueDigitalCredential(preAuthorizedCode) {
// Check for Digital Credentials API and protocol support.
if (!window.DigitalCredential ||
!DigitalCredential.userAgentAllowsProtocol('openid4vci-v1')) {
// Provide an alternative issuance method.
showAlternativeIssuanceFlow();
return;
}
// Construct a credential offer according to the OpenID4VCI
// specification. This example uses the format that the
// demo CMWallet supports.
const credentialOffer = {
credential_issuer: 'https://issuer.example',
credential_configuration_ids: ['org.iso.18013.5.1.mDL'],
grants: {
'urn:ietf:params:oauth:grant-type:pre-authorized_code': {
'pre-authorized_code': preAuthorizedCode
}
},
// Metadata that the wallet uses to request and display the credential.
credential_issuer_metadata: {
credential_issuer: 'https://issuer.example',
credential_endpoint: 'https://issuer.example/openid4vci/credential',
nonce_endpoint: 'https://issuer.example/openid4vci/nonce',
credential_configurations_supported: {
'org.iso.18013.5.1.mDL': {
format: 'mso_mdoc',
doctype: 'org.iso.18013.5.1.mDL',
// Bind the credential to a key that the wallet generates.
cryptographic_binding_methods_supported: ['cose_key'],
proof_types_supported: {
jwt: { proof_signing_alg_values_supported: ['ES256'] }
},
credential_metadata: {
display: [{ name: 'Mobile driving license', locale: 'en-US' }],
// The claims that this credential contains. For a full list of
// standard mDL claims, see the ISO/IEC 18013-5 specification.
claims: [{
path: ['org.iso.18013.5.1', 'family_name'],
display: [{ name: 'Family name', locale: 'en-US' }]
}
// ... Add any other claims for your credential here.
]
}
}
}
},
// Metadata of the authorization server that issues access tokens.
authorization_server_metadata: {
issuer: 'https://issuer.example',
token_endpoint: 'https://issuer.example/openid4vci/token'
}
};
try {
const credential = await navigator.credentials.create({
digital: {
requests: [{
// The protocol identifier for OpenID4VCI 1.0.
protocol: 'openid4vci-v1',
// Pass the offer as an object, not as a JSON string.
data: credentialOffer
}]
}
});
// The wallet handled the request. credential.data is an object that
// contains the wallet's protocol-specific response. It is not the issued
// credential, and it does not necessarily mean that issuance is complete.
// Your server knows when the wallet retrieves the credential from your
// credential endpoint.
// Implement your custom logic here as needed.
showIssuanceStatus(credential);
} catch (error) {
switch (error.name) {
case 'NotAllowedError':
// The user canceled the flow, no wallet can handle the request, or
// the call does not have transient user activation.
break;
case 'NotSupportedError':
// The browser does not support Digital Credentials API issuance.
// Fall back to your custom alternative flow logic.
showAlternativeIssuanceFlow();
break;
case 'TypeError':
// The request is malformed, for example, data is not an object.
console.error('Invalid issuance request:', error);
break;
default:
// For example, AbortError or NetworkError.
console.error('Credential issuance failed:', error);
}
}
}
const addButton = document.querySelector('#add-to-wallet');
addButton.addEventListener('click', () => {
// Your server adds a pre-authorized code for the signed-in user
// to the button's data-pre-authorized-code attribute.
issueDigitalCredential(addButton.dataset.preAuthorizedCode);
});
এই উদাহরণে, showAlternativeIssuanceFlow() এবং showIssuanceStatus()
আপনার নিজস্ব অ্যাপ লজিকের জন্য ব্যবহার করা হয়েছে।
ক্রস-অরিজিন iframe থেকে create()-কে কল করতে, এম্বেড করা পৃষ্ঠাকে অবশ্যই
digital-credentials-create অনুমতি সংক্রান্ত নীতি ফিচারকে অনুমতি দিতে হবে। অন্যথায়, কলটি
NotAllowedError-এর সাথে বাতিল হয়ে যায়:
<iframe src="https://issuer.example" allow="digital-credentials-create">
</iframe>
অরিজিন ট্রায়ালের পর থেকে হওয়া পরিবর্তন
অরিজিন ট্রায়ালের পর থেকে API পদ্ধতি ও প্যারামিটার পরিবর্তন করা হয়নি। তবে, Chrome 143 ও Chrome 155-এর মধ্যে নিম্নলিখিত পরিবর্তনগুলি শিপ করা হয়েছে এবং এর মধ্যে কিছু পরিবর্তনের জন্য আপনাকে কোড আপডেট করতে হতে পারে। নিচের সারণীতে পরিবর্তনের সংক্ষিপ্ত বিবরণ দেওয়া হল এবং এর পরের বিভাগে প্রতিটি পরিবর্তন ব্যাখ্যা করা হয়েছে।
| এলাকা | অরিজিন ট্রায়াল (Chrome 143) | Chrome 155 |
|---|---|---|
| উপলভ্যতা | অরিজিন ট্রায়াল টোকেন বা chrome://flags/#web-identity-digital-credentials-creation ফ্ল্যাগ |
ডিফল্ট হিসেবে চালু করা আছে |
| ব্যবহারকারী অ্যাক্টিভেশন | প্রয়োজন, কিন্তু ব্যবহার করা হয়নি | প্রতিটি create() কলের জন্য প্রয়োজন ও ব্যবহার করা হয় (Chrome 146) |
| বাতিল করা সংক্রান্ত সমস্যা | NetworkError |
NotAllowedError (Chrome 148) |
| প্রোটোকল শনাক্তকারী | Chrome অপারেটিং সিস্টেমে যেকোনও শনাক্তকারী পাস করে | শনাক্ত না করা আইডেন্টিফায়ার অবচিতি সংক্রান্ত সতর্কতা ট্রিগার করে (Chrome 151) |
| অস্বচ্ছ সোর্স | অনুমোদিত | NotAllowedError-এর সাথে ব্লক করা হয়েছে (Chrome 151) |
| অটোমেটেড টেস্টিং | কোনও বিল্ট-ইন সহায়তা নেই | Chrome DevTools Protocol-এ ভার্চুয়াল ওয়ালেট (Chrome 152) |
ব্যবহারকারী অ্যাক্টিভেশন ব্যবহার করা হয়েছে
Chrome 146 থেকে, digital মেম্বারের সাথে create() কল করলে
ট্রানজিয়েন্ট ব্যবহারকারী অ্যাক্টিভেশন
ব্যবহার করা হয়, কারণ স্পেসিফিকেশনের জন্য এটি প্রয়োজন। অরিজিন ট্রায়াল চলাকালীন, Chrome ব্যবহারকারীর অ্যাক্টিভেশন চেক করেছে
কিন্তু এটি ব্যবহার করেনি।
এর ফলে, প্রতিটি create() কলের জন্য নিজস্ব ইউজার জেসচার প্রয়োজন, যেমন, বোতামে ক্লিক করা। ইউজার অ্যাক্টিভেশন ছাড়া, প্রমিস
NotAllowedError-এর সাথে বাতিল হয়ে যায়। কলের পরে, window.open() এবং অন্যান্য API যেগুলির জন্য
ব্যবহারকারীর অ্যাক্টিভেশন প্রয়োজন সেগুলি একই জেসচার ব্যবহার করতে পারবে না।
NotAllowedError-এর মাধ্যমে বাতিল করার অনুরোধ প্রত্যাখ্যান করা হয়েছে
Chrome 148 থেকে শুরু করে, ব্যবহারকারী ফ্লো বাতিল করলে, create() যে প্রমিস রিটার্ন করে তা
NotAllowedError-এর সাথে বাতিল হয়ে যায়, যেমন, Android-এ
ওয়ালেট সিলেক্টর বাতিল করে অথবা ডেস্কটপে QR কোড ডায়ালগ বন্ধ করে। কোনও Wallet অ্যাপ অনুরোধ ম্যানেজ করতে না পারলে,
প্রমিসও NotAllowedError-এর সাথে বাতিল হয়ে যায়।
অরিজিন ট্রায়াল চলাকালীন, এইসব কেস NetworkError-এর মাধ্যমে বাতিল করা হয়েছে।
বাতিলকরণ শনাক্ত করার জন্য আপনার কোড যদি NetworkError চেক করে, তাহলে এটি আপডেট করে
পরিবর্তে NotAllowedError চেক করুন।
শনাক্ত করা হয়নি এমন প্রোটোকল আইডেন্টিফায়ার সতর্কতা ট্রিগার করে
স্পেসিফিকেশনটি OpenID4VCI 1.0-এর জন্য একটি একক ইস্যুয়েন্স প্রোটোকল শনাক্তকারী,
openid4vci-v1, সংজ্ঞায়িত করে। Chrome 155 openid4vci-v1, এবং
openid4vci-কে শনাক্ত করে। যেহেতু openid4vci স্পেসিফিকেশনের অংশ নয়, তাই আমরা
সাজেস্ট করি যে আপনি openid4vci-v1 ব্যবহার করুন।
Chrome যেকোনও প্রোটোকল শনাক্তকারী সহ অনুরোধ প্ল্যাটফর্মে পাস করে। তবে,
Chrome 151 থেকে শুরু করে, কোনও পৃষ্ঠা অজানা প্রোটোকল শনাক্তকারী সহ
create() কল করলে DevTools একটি অবচয়নের সতর্কতা দেখায়। Chrome-এর উদ্দেশ্য হল,
অপরিচিত প্রোটোকল শনাক্তকারী সহ অনুরোধ ব্লক করা। স্ট্যাটাস জানতে, Digital Credential API এন্ট্রিতে আরও নির্দিষ্ট প্রোটোকল ফিল্টারিং দেখুন।
এই আচরণ পরীক্ষা করতে, chrome://flags/#enable-experimental-web-platform-features চালু করুন। এই ফ্ল্যাগ চালু থাকলে, create() অজানা প্রোটোকল শনাক্তকারী সহ অনুরোধ উপেক্ষা করে এবং
কোনও অনুরোধ বাকি না থাকলে TypeError সহ প্রত্যাখ্যান করে। এছাড়াও,
DigitalCredential.userAgentAllowsProtocol() শুধুমাত্র স্বীকৃত প্রোটোকলের জন্য
true রিটার্ন করে। ফ্ল্যাগ ছাড়া, এটি শুধুমাত্র শনাক্তকারীটি সঠিকভাবে তৈরি করা হয়েছে কিনা তা চেক করে।
তাই, ফিচার শনাক্তকরণের জন্য শুধু userAgentAllowsProtocol()-এর উপর নির্ভর করবেন না।
উদাহরণে যেমন দেখানো হয়েছে সেইভাবে NotSupportedError হ্যান্ডেল করুন।
অস্বচ্ছ অরিজিন ব্লক করা আছে
Chrome 151 থেকে শুরু করে, create() NotAllowedError-এর সাথে প্রত্যাখ্যান করে যখন
অস্বচ্ছ উৎস
সহ একটি ডকুমেন্ট এটিকে কল করে, যেমন allow-same-origin টোকেন ছাড়া একটি স্যান্ডবক্সযুক্ত iframe।
অরিজিন ট্রায়াল চলাকালীন, Chrome এইসব কল ব্লক করেনি।
ভার্চুয়াল ওয়ালেট দিয়ে টেস্ট করুন
Chrome 152 থেকে শুরু করে, আপনি Android ডিভাইস বা Wallet অ্যাপ ছাড়াই আপনার ইস্যু করার ফ্লো পরীক্ষা করতে পারবেন।
Chrome DevTools Protocol (CDP)-এ
পরীক্ষামূলক DigitalCredentials.setVirtualWalletBehavior কমান্ডটি
ভার্চুয়াল ওয়ালেট প্রয়োগ করে যা অটোমেটিক পরীক্ষার জন্য স্পেসিফিকেশন নির্ধারণ করে। ভার্চুয়াল ওয়ালেট আপনার দেওয়া ডেটা দিয়ে উত্তর দিতে পারে, ব্যবহারকারী ফ্লো বাতিল করলে যেমন হয় সেইভাবে অনুরোধ বাতিল করতে পারে অথবা টাইমআউট ও বাতিল করার বিষয়টি পরীক্ষা করার জন্য অনুরোধ পেন্ডিং রাখতে পারে।
নিম্নলিখিত Puppeteer টেস্ট openid4vci-v1 অনুরোধের উত্তর দিতে ভার্চুয়াল ওয়ালেট সেট করে, তারপর ইস্যু করা শুরু করার বোতামে ক্লিক করে:
const client = await page.createCDPSession();
await client.send('DigitalCredentials.setVirtualWalletBehavior', {
action: 'respond',
protocol: 'openid4vci-v1',
response: {}
});
// Clicking the button provides the user activation that create() requires.
await page.click('#add-to-wallet');
ইন্ডাস্ট্রি অ্যাডপশন
আমরা Digital Credentials API ইস্যু করার অ্যাডপশন দেখতে পাচ্ছি। যেমন, জার্মান আর্থিক প্রতিষ্ঠান Sparkasse, Digital Credentials API ব্যবহার করে অ্যাকাউন্ট হোল্ডারদের Google Wallet-এ যাচাই করা বয়স সংক্রান্ত ক্রেডেনশিয়াল সেভ করতে দেয়। অ্যাকাউন্ট হোল্ডাররা তখন এই ক্রেডেনশিয়াল ব্যবহার করে অনলাইনে এবং নিজে উপস্থিত থেকে তাদের বয়স যাচাই করতে পারবেন।
এটি ব্যবহার করে দেখুন
ডিজিটাল ক্রেডেনশিয়াল API ইস্যু করা টেস্ট করার আগে, আপনার কাছে নিম্নলিখিতগুলি আছে কিনা তা নিশ্চিত করুন:
- Chrome 155 বা তার পরবর্তী যেকোনও ভার্সনে আপডেট করুন।
- আপনার Android ডিভাইসে কাজ করে এমন একটি Wallet অ্যাপ ইনস্টল করুন, যেমন, demo CMWallet।
- দুটি ডিভাইসেই ব্লুটুথ চালু করা আছে (শুধুমাত্র ক্রস-ডিভাইস ফ্লো)।
ক্রস-ডিভাইস ফ্লো পরীক্ষা করতে:
- আপনার কম্পিউটারে, ডেমো ইস্যুকারী সাইট খুলুন।
- যোগ করুন বোতামে ক্লিক করুন।
- আপনার Android ডিভাইস দিয়ে QR কোড স্ক্যান করুন এবং অন-স্ক্রিন নির্দেশাবলী অনুসরণ করুন।
একই-ডিভাইস ফ্লো পরীক্ষা করতে, আপনার Android ডিভাইসে Chrome-এ ইস্যুকারীর ডেমো সাইট খুলুন।
ডেভেলপার রিসোর্স
আপনার ওয়েবসাইটে Digital Credentials API ইস্যু করা ইন্টিগ্রেট করা শুরু করতে, নিম্নলিখিত রিসোর্স ব্যবহার করুন:
- W3C Web Identity & Credentials Adoption Community Group-এর ডেভেলপার নির্দেশিকা পড়ুন।
- W3C ডিজিটাল ক্রেডেনশিয়াল স্পেসিফিকেশন পড়ুন।
- OpenID for Verifiable Credential Issuance 1.0 স্পেসিফিকেশন পড়ুন।
- Android-এর জন্য ওপেন সোর্স ডেমো ওয়ালেট অ্যাপ, CMWallet ডেমো-এর সোর্স কোড এক্সপ্লোর করুন।
- ক্রেডেনশিয়াল ম্যানেজার থেকে Android Wallet অ্যাপ কীভাবে ইস্যু করার অনুরোধ ম্যানেজ করে তা জানুন।
- আপনার Android ডিভাইসে ইনস্টল করা ডেমো CMWallet-এর সাথে ডেমো ইস্যুকারী সাইট ব্যবহার করে দেখুন।
- অনুরোধের পেলোড কেমন দেখতে হয় তা জানতে Digital Credentials অনুরোধ কনস্ট্রাক্টর ডেমো এক্সপ্লোর করুন।
আপনার মতামত জানান
কোনও বাগ সম্পর্কে অভিযোগ জানাতে বা কোনও ফিচারের জন্য অনুরোধ করতে, Chromium বাগ ট্র্যাকার-এ সমস্যাটি ফাইল করুন।