Yayınlanma tarihi: 23 Ekim 2026
Chrome 155 ve sonraki sürümlerde Digital Credentials API'nin yayınlanması varsayılan olarak etkinleştirilir. Bu nedenle, API'yi kullanmak için artık kaynak denemesi jetonuna veya işaretine ihtiyacınız yoktur. Digital Credentials API, web sitelerinin kullanıcının mobil cihazında yüklü cüzdan uygulamalarına bağlanmasına olanak tanıyan bir aktarım katmanıdır. Kart verme özelliği sayesinde kartı veren kuruluşlar, kullanıcının cüzdan uygulamasına doğrudan yeni kimlik bilgileri (ör. dijital kimlikler) ekleyebilir.
Arka plan
Dijital kimlik ekosisteminde üç taraf vardır: verenler, doğrulayıcılar (güvenen taraflar olarak da adlandırılır) ve sahipler (cüzdan uygulamaları). Kullanıcılar genellikle push kart ekleme aracılığıyla cüzdan uygulamalarına dijital kimlik ekler. Bu yöntemde kullanıcı, kart sağlayıcının web sitesinden veya uygulamasından kart verme işlemini başlatır. Örneğin, üniversite web sitesindeki (kart sağlayıcı) bir öğrenci, dijital öğrenci kimliğini tercih ettiği cüzdan uygulamasına (kart sahibi) kaydedebilir.
Bu modelin başarılı olması için veren kuruluşun, kimliği vermek üzere cüzdan uygulamasını çağıracak güvenli ve güvenilir bir yönteme ihtiyacı vardır. Bu API'den önce her veren kuruluşun, iş ortaklığı yaptığı cüzdan uygulamalarını açmak için genellikle özel URI şemaları ile kendi yöntemini oluşturması gerekiyordu. Kartı veren kuruluşların her cüzdan uygulaması için ayrı bir mekanizma kullanması gerekiyordu ve kullanıcıların cüzdan uygulaması seçmek için tutarlı bir yöntemi yoktu.
Dijital kimlik bilgisi verme işleminin işleyiş şekli
Chrome, bu süreci kolaylaştırmak için W3C Digital Credentials API ile kimlik bilgisi vermeyi destekler. Bu özellik, Chrome 141'de kullanıma sunulan sunum özelliklerine (dijital kimlik bilgisinden istenen seçmeli verileri doğrulayıcıyla paylaşma) eklenir. Veren kuruluşun web sitesi, düzenleme isteği içeren bir digital üyesiyle navigator.credentials.create() yöntemini çağırdığında Chrome, isteği işletim sistemine (Android'de Kimlik Bilgisi Yöneticisi) iletir. Ardından işletim sistemi, kullanıcının cüzdan uygulamasını seçtiği kendi arayüzünü gösterir. API, Doğrulanabilir Kimlik Bilgisi Verme için OpenID (OpenID4VCI) gibi endüstri standardı protokollerle çalışır.
Kart verme işlemi iki akışı destekler: Android'de aynı cihaz akışı ve masaüstünde başlayıp Android cihazda tamamlanan cihazlar arası akış.
Android'de aynı cihaz akışı
Android'de Chrome, verme isteğini Android Kimlik Bilgisi Yöneticisi'ne iletir. Kimlik Bilgisi Yöneticisi, cihazdaki uyumlu cüzdan uygulamalarının listesini gösterir. Kullanıcı bir cüzdan seçer ve kimlik bilgisinin eklenmesine izin verir. Cüzdan uygulaması, OpenID4VCI gibi bir yayınlama protokolü kullanarak kimlik bilgilerini veren kuruluştan alır.
Masaüstünde cihazlar arası akış
Masaüstünde Chrome bir QR kodu gösterir. Kullanıcı, Android cihazıyla kodu tarar ve önceki bölümde açıklandığı gibi akışı bu cihazda tamamlar. Cihazlar, birbirlerine yakın olduklarını doğrulamak için Bluetooth'u kullanır. Bu nedenle Chrome, kapalıysa kullanıcıdan Bluetooth'u açmasını ister. Chrome, Digital Credentials API sunumu için aynı cihazlar arası mekanizmayı kullanır.
API'yi kullanarak kart verme özelliğini uygulama
Kart verme akışını başlatmak için navigator.credentials.create() yöntemini çağırın ve kart verme isteklerinizi bir digital üyesinin içinde iletin. Çağrı için geçici kullanıcı etkinleştirmesi gerektiğinden bu çağrıyı bir tıklama işleyiciden veya başka bir kullanıcı hareketi işleyicisinden yapın. Aşağıdaki örnekte, önceden yetkilendirilmiş kod akışıyla birlikte bir OpenID4VCI kimlik bilgisi teklifi kullanılmaktadır:
// 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);
});
Bu örnekte showAlternativeIssuanceFlow() ve showIssuanceStatus(), uygulamanızın kendi mantığını temsil eder.
create() yöntemini çapraz kaynak iframe'den çağırmak için yerleştirme sayfasının digital-credentials-create izin politikası özelliğine izin vermesi gerekir. Aksi takdirde çağrı, NotAllowedError ile reddedilir:
<iframe src="https://issuer.example" allow="digital-credentials-create">
</iframe>
Kaynak denemesinden bu yana yapılan değişiklikler
API yöntemleri ve parametreleri, kaynak denemesinden bu yana değişmedi. Ancak aşağıdaki değişiklikler Chrome 143 ile Chrome 155 arasında kullanıma sunuldu ve bunlardan bazıları için kodunuzu güncellemeniz gerekebilir. Aşağıdaki tabloda değişiklikler özetlenmiş ve tablodan sonraki bölümlerde her biri açıklanmıştır.
| Bölge | Kaynak denemesi (Chrome 143) | Chrome 155 |
|---|---|---|
| Kullanılabilirlik | Kaynak denemesi jetonu veya chrome://flags/#web-identity-digital-credentials-creation işareti |
Varsayılan olarak etkindir |
| Kullanıcı etkinleştirme | Gerekli ancak kullanılmıyor | Her create() çağrısı için gereklidir ve kullanılır (Chrome 146) |
| İptal hataları | NetworkError |
NotAllowedError (Chrome 148) |
| Protokol tanımlayıcıları | Chrome, işletim sistemine herhangi bir tanımlayıcı iletir. | Tanınmayan tanımlayıcılar, desteğin sonlandırılmasıyla ilgili bir uyarı tetikler (Chrome 151) |
| Opak kaynaklar | İzin veriliyor | NotAllowedError ile engellendi (Chrome 151) |
| Otomatik test | Yerleşik destek yok | Chrome Geliştirici Araçları Protokolü'nde sanal cüzdan (Chrome 152) |
Kullanıcı etkinleştirmesi kullanıldı
Chrome 146 sürümünden itibaren, digital üyesi olan bir create() çağrısı, spesifikasyonun gerektirdiği şekilde geçici kullanıcı etkinleştirmesini kullanır. Kaynak denemesi sırasında Chrome, kullanıcı etkinleştirmesini kontrol etti ancak kullanmadı.
Bu nedenle, her create() çağrısının kendi kullanıcı hareketine (ör. düğme tıklaması) ihtiyacı vardır. Kullanıcı etkinliği olmadan promise, NotAllowedError ile reddedilir. Çağrıdan sonra window.open() ve kullanıcı etkinleştirmesi gerektiren diğer API'ler aynı hareketi kullanamaz.
NotAllowedError ile iptal reddi
Chrome 148'den itibaren, kullanıcı akışı iptal ettiğinde (ör. Android'de cüzdan seçiciyi kapatarak veya masaüstünde QR kodu iletişim kutusunu kapatarak) create() tarafından döndürülen promise, NotAllowedError ile reddedilir. İstek, hiçbir cüzdan uygulaması tarafından işlenemediğinde de promise NotAllowedError ile reddedilir.
Kaynak denemesi sırasında bu istekler NetworkError ile reddediliyordu.
Kodunuz iptali algılamak için NetworkError değerini kontrol ediyorsa bunun yerine NotAllowedError değerini kontrol edecek şekilde güncelleyin.
Tanınmayan protokol tanımlayıcıları uyarı tetikler.
Spesifikasyon, OpenID4VCI 1.0 için tek bir yayınlama protokolü tanımlayıcısı (openid4vci-v1) tanımlar. Chrome 155, openid4vci-v1 ve openid4vci'yi tanır. openid4vci, spesifikasyonun bir parçası olmadığından openid4vci-v1 kullanmanızı öneririz.
Chrome, herhangi bir protokol tanımlayıcısı içeren istekleri platforma iletir. Ancak Chrome 151'den itibaren Geliştirici Araçları, bir sayfa tanınmayan bir protokol tanımlayıcısıyla create() yöntemini çağırdığında desteğin sonlandırılmasıyla ilgili bir uyarı gösterir. Chrome, tanınmayan protokol tanımlayıcıları içeren istekleri engellemeyi planlıyor. Durum için Digital Credential API'de daha spesifik protokol filtreleme girişine bakın.
Bu davranışı test etmek için chrome://flags/#enable-experimental-web-platform-features ayarını etkinleştirin. Bu işaret etkinleştirildiğinde create(), tanınmayan protokol tanımlayıcıları içeren istekleri yoksayar ve istek kalmazsa TypeError ile reddeder. Ayrıca, DigitalCredential.userAgentAllowsProtocol() yalnızca tanınan protokoller için true değerini döndürür. İşaret olmadan yalnızca tanımlayıcının doğru biçimlendirilip biçimlendirilmediği kontrol edilir.
Bu nedenle, özellik algılama için yalnızca userAgentAllowsProtocol() kullanmayın.
NotSupportedError değerini örnekte gösterildiği gibi işleyin.
Opak kaynaklar engellendi
Chrome 151'den itibaren create(), opak kaynaklı bir doküman (ör. allow-same-origin jetonu olmayan korumalı alana alınmış bir iframe) tarafından çağrıldığında NotAllowedError ile reddedilir.
Chrome, kaynak denemesi sırasında bu çağrıları engellemedi.
Sanal cüzdanla test etme
Chrome 152'den itibaren, yayın akışınızı Android cihaz veya cüzdan uygulaması olmadan test edebilirsiniz. Chrome Geliştirici Araçları Protokolü'ndeki (CDP) deneysel DigitalCredentials.setVirtualWalletBehavior komutu, spesifikasyonun otomatik test için tanımladığı sanal cüzdanı uygular. Sanal cüzdan, sağladığınız verilerle yanıt verebilir, istekleri kullanıcı akışı iptal etmiş gibi reddedebilir veya zaman aşımı ve iptal testleri için istekleri beklemede bırakabilir.
Aşağıdaki Puppeteer testi, sanal cüzdanı openid4vci-v1 isteklerine yanıt verecek şekilde ayarlar ve ardından kart verme işlemini başlatan düğmeyi tıklar:
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');
Sektörde kullanım
Digital Credentials API'nin kullanımının arttığını görüyoruz. Örneğin, Almanya'daki finans kuruluşu Sparkasse, hesap sahiplerinin doğrulanmış yaş kimlik bilgilerini Google Cüzdan'a kaydetmesine olanak tanımak için Digital Credentials API'yi kullanıyor. Hesap sahipleri daha sonra bu kimlik bilgilerini kullanarak yaşlarını internette ve şahsen doğrulayabilir.
Deneyin
Digital Credentials API ile belge verme işlemini test etmeden önce aşağıdakilere sahip olduğunuzdan emin olun:
- Chrome 155 veya sonraki bir sürüme güncelleyin.
- Android cihazınıza desteklenen bir cüzdan uygulaması (ör. demo CMWallet) yükleyin.
- Her iki cihazda da Bluetooth'un açık olması (yalnızca cihazlar arası akış).
Cihazlar arası akışı test etmek için:
- Bilgisayarınızda demo kartı veren kuruluş sitesini açın.
- Ekle düğmesini tıklayın.
- QR kodunu Android cihazınızla tarayın ve ekrandaki talimatları uygulayın.
Aynı cihaz akışını test etmek için Android cihazınızda Chrome'u kullanarak demo kartı veren kuruluş sitesini açın.
Geliştirici kaynakları
Digital Credentials API ile kimlik bilgisi verme özelliğini web sitenize entegre etmeye başlamak için aşağıdaki kaynakları kullanın:
- W3C Web Identity & Credentials Adoption Community Group tarafından hazırlanan geliştirici kılavuzunu okuyun.
- W3C Dijital Kimlik Bilgileri spesifikasyonunu okuyun.
- Doğrulanabilir Kimlik Bilgisi Verme 1.0 için OpenID spesifikasyonunu okuyun.
- Android için açık kaynaklı bir demo cüzdan uygulaması olan demo CMWallet'ın kaynak kodunu inceleyin.
- Android cüzdan uygulamalarının, Kimlik Bilgisi Yöneticisi'nden gelen verme isteklerini nasıl işlediğini öğrenin.
- Android cihazınızda yüklü olan demo CMWallet ile demo veren sitesini deneyin.
- İstek yükünün nasıl göründüğünü öğrenmek için Dijital Kimlik Bilgileri istek oluşturucu demosunu inceleyin.
Görüşlerinizi paylaşın
Hata bildirmek veya özellik isteğinde bulunmak için Chromium hata izleyicide sorun kaydı oluşturun.