Ngày xuất bản: 23 tháng 10 năm 2026
Trong Chrome 155 trở lên, tính năng cấp phát Digital Credentials API được bật theo mặc định, nên bạn không cần mã thông báo bản dùng thử theo nguyên gốc hoặc cờ để sử dụng tính năng này nữa. Digital Credentials API là một tầng truyền tải cho phép các trang web kết nối với các ứng dụng ví được cài đặt trên thiết bị di động của người dùng. Với tính năng phát hành, tổ chức phát hành có thể thêm thông tin xác thực mới (chẳng hạn như giấy tờ tuỳ thân kỹ thuật số) ngay vào ứng dụng ví của người dùng.
Thông tin khái quát
Hệ sinh thái danh tính kỹ thuật số có ba bên: tổ chức phát hành, bên xác minh (còn gọi là bên tin cậy) và chủ sở hữu (ứng dụng ví). Người dùng thường thêm giấy tờ tuỳ thân điện tử vào ứng dụng ví của họ thông qua quy trình cấp phép qua công nghệ đẩy, trong đó người dùng bắt đầu quy trình cấp từ trang web hoặc ứng dụng của tổ chức phát hành. Ví dụ: một sinh viên trên trang web của trường đại học (tổ chức phát hành) có thể lưu thẻ sinh viên điện tử vào ứng dụng ví mà họ muốn (người sở hữu).
Để mô hình này thành công, tổ chức phát hành cần có một cách an toàn và đáng tin cậy để gọi ứng dụng ví nhằm phát hành giấy tờ tuỳ thân. Trước khi có API này, mỗi công ty phát hành phải xây dựng cách riêng để mở các ứng dụng ví mà họ hợp tác, thường là bằng lược đồ URI tuỳ chỉnh. Tổ chức phát hành phải duy trì một cơ chế riêng cho từng ứng dụng ví và người dùng không có cách nhất quán để chọn ứng dụng ví.
Cách hoạt động của quy trình cấp thông tin xác thực kỹ thuật số
Để đơn giản hoá quy trình này, Chrome hỗ trợ việc cấp phát bằng
API Thông tin xác thực kỹ thuật số của W3C. Tính năng này bổ sung vào khả năng trình bày (chia sẻ dữ liệu được yêu cầu, có chọn lọc từ thông tin xác thực kỹ thuật số với trình xác minh), được cung cấp trong Chrome 141. Khi trang web của tổ chức phát hành gọi navigator.credentials.create() bằng một thành viên digital chứa yêu cầu phát hành, Chrome sẽ chuyển yêu cầu đó đến hệ điều hành (trên Android, Trình quản lý thông tin xác thực). Sau đó, hệ điều hành sẽ hiển thị giao diện riêng để người dùng chọn một ứng dụng ví. API này hoạt động với các giao thức tiêu chuẩn ngành như OpenID cho việc cấp thông tin xác thực có thể xác minh (OpenID4VCI).
Quy trình phát hành hỗ trợ hai quy trình: quy trình trên cùng một thiết bị Android và quy trình trên nhiều thiết bị bắt đầu trên máy tính và kết thúc trên thiết bị Android.
Quy trình trên cùng thiết bị Android
Trên Android, Chrome chuyển yêu cầu phát hành đến Trình quản lý thông tin xác thực của Android. Trình quản lý này sẽ hiển thị danh sách các ứng dụng ví tương thích trên thiết bị. Người dùng chọn một ví và đồng ý thêm thông tin xác thực. Sau đó, ứng dụng ví sẽ nhận được thông tin xác thực từ tổ chức phát hành bằng giao thức phát hành, chẳng hạn như OpenID4VCI.
Quy trình trên nhiều thiết bị trên máy tính
Trên máy tính, Chrome sẽ hiển thị một mã QR. Người dùng quét mã bằng thiết bị Android của họ và hoàn tất quy trình trên thiết bị đó, như mô tả trong phần trước. Các thiết bị sử dụng Bluetooth để xác nhận rằng chúng ở gần nhau, vì vậy, Chrome sẽ yêu cầu người dùng bật Bluetooth nếu Bluetooth đang tắt. Chrome sử dụng cùng một cơ chế trên nhiều thiết bị để trình bày Digital Credentials API.
Triển khai quy trình phát hành bằng API
Để bắt đầu quy trình phát hành, hãy gọi navigator.credentials.create() và truyền các yêu cầu phát hành của bạn vào một thành viên digital. Thực hiện lệnh gọi này từ trình xử lý lượt nhấp hoặc trình xử lý cử chỉ khác của người dùng, vì lệnh gọi này yêu cầu kích hoạt người dùng tạm thời. Ví dụ sau đây sử dụng lời đề nghị cấp thông tin xác thực OpenID4VCI với quy trình sử dụng mã uỷ quyền trước:
// 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);
});
Trong ví dụ này, showAlternativeIssuanceFlow() và showIssuanceStatus() đại diện cho logic ứng dụng của riêng bạn.
Để gọi create() từ một iframe khác nguồn gốc, trang nhúng phải cho phép tính năng chính sách về quyền digital-credentials-create. Nếu không, lệnh gọi sẽ từ chối bằng NotAllowedError:
<iframe src="https://issuer.example" allow="digital-credentials-create">
</iframe>
Thay đổi kể từ bản dùng thử theo nguyên gốc
Các phương thức và tham số API không thay đổi kể từ bản dùng thử theo nguyên gốc. Tuy nhiên, những thay đổi sau đây đã được triển khai từ Chrome 143 đến Chrome 155 và một số thay đổi có thể yêu cầu bạn cập nhật mã. Bảng sau đây tóm tắt các thay đổi và các phần sau đó giải thích từng thay đổi.
| Khu vực | Bản dùng thử theo nguyên gốc (Chrome 143) | Chrome 155 |
|---|---|---|
| Phạm vi cung cấp | Mã thông báo dùng thử theo nguyên gốc hoặc cờ chrome://flags/#web-identity-digital-credentials-creation |
Bật theo mặc định |
| Kích hoạt người dùng | Bắt buộc nhưng không được sử dụng | Bắt buộc và được sử dụng trong mỗi lệnh gọi create() (Chrome 146) |
| Lỗi huỷ | NetworkError |
NotAllowedError (Chrome 148) |
| Giá trị nhận dạng giao thức | Chrome chuyển mọi giá trị nhận dạng đến hệ điều hành | Giá trị nhận dạng không được nhận dạng sẽ kích hoạt cảnh báo ngừng sử dụng (Chrome 151) |
| Nguồn gốc mờ (opaque) | Được phép | Bị chặn bằng NotAllowedError (Chrome 151) |
| Kiểm thử tự động | Không có tính năng hỗ trợ tích hợp sẵn | Ví ảo trong Giao thức Chrome DevTools (Chrome 152) |
Hoạt động của người dùng được tiêu thụ
Kể từ Chrome 146, lệnh gọi create() có thành viên digital sẽ sử dụng hoạt động kích hoạt tạm thời của người dùng, theo yêu cầu của thông số kỹ thuật. Trong bản dùng thử theo nguyên gốc, Chrome đã kiểm tra hoạt động kích hoạt của người dùng nhưng không sử dụng hoạt động đó.
Do đó, mỗi lệnh gọi create() cần có cử chỉ riêng của người dùng, chẳng hạn như một lượt nhấp vào nút. Nếu không có hoạt động kích hoạt của người dùng, lời hứa sẽ từ chối bằng một
NotAllowedError. Sau lệnh gọi, window.open() và các API khác yêu cầu người dùng kích hoạt sẽ không thể sử dụng cùng một cử chỉ.
Huỷ từ chối bằng NotAllowedError
Kể từ Chrome 148, lời hứa mà create() trả về sẽ từ chối bằng NotAllowedError khi người dùng huỷ quy trình, chẳng hạn như bằng cách đóng bộ chọn ví trên Android hoặc đóng hộp thoại mã QR trên máy tính. Lời hứa cũng từ chối bằng NotAllowedError khi không có ứng dụng ví nào có thể xử lý yêu cầu.
Trong thời gian chạy bản dùng thử theo nguyên gốc, những trường hợp này đã bị từ chối kèm theo NetworkError.
Nếu mã của bạn kiểm tra NetworkError để phát hiện việc huỷ, hãy cập nhật mã để kiểm tra NotAllowedError.
Giá trị nhận dạng giao thức không nhận dạng được sẽ kích hoạt cảnh báo
Quy cách này xác định một giá trị nhận dạng giao thức phát hành duy nhất,
openid4vci-v1, cho OpenID4VCI 1.0. Chrome 155 nhận dạng openid4vci-v1 và
openid4vci. Vì openid4vci không thuộc thông số kỹ thuật, nên bạn nên sử dụng openid4vci-v1.
Chrome chuyển các yêu cầu có giá trị nhận dạng giao thức bất kỳ đến nền tảng. Tuy nhiên,
bắt đầu từ Chrome 151, Công cụ cho nhà phát triển sẽ hiển thị cảnh báo ngừng sử dụng khi một trang gọi
create() bằng giá trị nhận dạng giao thức không được nhận dạng. Chrome dự định chặn
các yêu cầu có giá trị nhận dạng giao thức không nhận dạng được. Để biết trạng thái, hãy xem
mục Lọc giao thức cụ thể hơn trong Digital Credential API.
Để kiểm thử hành vi này, hãy bật chrome://flags/#enable-experimental-web-platform-features. Khi bạn bật cờ này, create() sẽ bỏ qua các yêu cầu có giá trị nhận dạng giao thức không nhận dạng được và từ chối bằng TypeError nếu không còn yêu cầu nào. Ngoài ra, DigitalCredential.userAgentAllowsProtocol() chỉ trả về true cho các giao thức được nhận dạng. Nếu không có cờ, thì công cụ này chỉ kiểm tra xem giá trị nhận dạng có đúng định dạng hay không.
Vì vậy, đừng chỉ dựa vào userAgentAllowsProtocol() để phát hiện tính năng.
Xử lý NotSupportedError như trong ví dụ.
Nguồn gốc không rõ ràng bị chặn
Kể từ Chrome 151, create() sẽ từ chối bằng NotAllowedError khi một tài liệu có nguồn gốc mờ gọi API này, chẳng hạn như một iframe hộp cát không có mã thông báo allow-same-origin.
Trong thời gian chạy bản dùng thử theo nguyên gốc, Chrome không chặn các lệnh gọi này.
Thử nghiệm bằng ví ảo
Kể từ Chrome 152, bạn có thể kiểm thử quy trình phát hành mà không cần thiết bị Android hoặc ứng dụng ví. Lệnh DigitalCredentials.setVirtualWalletBehavior thử nghiệm trong Giao thức Chrome DevTools (CDP) triển khai ví ảo mà thông số kỹ thuật xác định cho hoạt động kiểm thử tự động. Ví ảo có thể phản hồi bằng dữ liệu mà bạn cung cấp, từ chối yêu cầu như thể người dùng đã huỷ quy trình hoặc để yêu cầu ở trạng thái chờ xử lý để kiểm tra thời gian chờ và huỷ bỏ.
Kiểm thử Puppeteer sau đây đặt ví ảo để phản hồi các yêu cầu openid4vci-v1, sau đó nhấp vào nút bắt đầu phát hành:
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');
Mức độ áp dụng trong ngành
Chúng tôi nhận thấy việc áp dụng Digital Credentials API để cấp thông tin xác thực. Ví dụ: tổ chức tài chính Sparkasse của Đức sử dụng Digital Credentials API để cho phép chủ tài khoản lưu thông tin xác thực tuổi đã xác minh vào Google Wallet. Sau đó, chủ tài khoản có thể sử dụng thông tin xác thực này để xác minh tuổi của họ trên mạng và trực tiếp.
Dùng thử
Trước khi kiểm thử việc phát hành API Thông tin xác thực kỹ thuật số, hãy đảm bảo rằng bạn có những thông tin sau:
- Cập nhật lên Chrome 155 trở lên.
- Cài đặt một ứng dụng ví được hỗ trợ trên thiết bị Android, ví dụ: CMWallet minh hoạ.
- Bluetooth được bật cho cả hai thiết bị (chỉ áp dụng cho quy trình trên nhiều thiết bị).
Cách kiểm thử quy trình trên nhiều thiết bị:
- Trên máy tính, hãy mở trang web minh hoạ của công ty phát hành.
- Nhấp vào nút Thêm.
- Quét mã QR bằng thiết bị Android rồi làm theo hướng dẫn trên màn hình.
Để kiểm thử quy trình trên cùng một thiết bị, hãy mở trang web minh hoạ của công ty phát hành trong Chrome trên thiết bị Android.
Tài nguyên dành cho nhà phát triển
Để bắt đầu tích hợp tính năng phát hành của Digital Credentials API vào trang web của bạn, hãy sử dụng các tài nguyên sau:
- Đọc hướng dẫn dành cho nhà phát triển của Nhóm cộng đồng áp dụng thông tin xác thực và danh tính web của W3C.
- Đọc quy cách về Thông tin xác thực kỹ thuật số của W3C.
- Đọc quy cách OpenID cho việc cấp thông tin xác thực có thể xác minh 1.0.
- Khám phá mã nguồn của CMWallet minh hoạ, một ứng dụng ví minh hoạ nguồn mở dành cho Android.
- Tìm hiểu cách các ứng dụng ví Android xử lý yêu cầu phát hành từ Trình quản lý thông tin xác thực.
- Dùng thử trang web của tổ chức phát hành minh hoạ với CMWallet minh hoạ được cài đặt trên thiết bị Android của bạn.
- Khám phá bản minh hoạ hàm khởi tạo yêu cầu Chứng chỉ danh tính kỹ thuật số để xem tải trọng yêu cầu trông như thế nào.
Chia sẻ ý kiến phản hồi của bạn
Để báo cáo lỗi hoặc yêu cầu tính năng, hãy gửi vấn đề trong trình theo dõi lỗi Chromium.