DCQL vysvětleno: jak si ověřovatel vyžádá od peněženky přesně to, co potřebuje
Digital Credentials Query Language, DCQL, je formát dotazů v JSON, který OpenID4VP používá v požadavku na prezentaci. Umožňuje spoléhající se straně popsat, která osvědčení a které údaje v nich chce vidět, a to tak, že jej dokáže zpracovat každá kompatibilní peněženka bez zakázkové integrace.
Problém, který DCQL řeší
Firemní peněženka může obsahovat osvědčení v několika formátech: registraci společnosti jako SD-JWT VC, odbornou kvalifikaci kódovanou jako mdoc nebo ověřitelné osvědčení W3C z dřívějšího pilotu. Ověřovatel, který potřebuje potvrdit pouze identifikační číslo a obchodní firmu, nemá přenositelný způsob, jak si napříč formáty vyžádat právě to. Musí buď přijmout celé osvědčení, nebo ručně naprogramovat samostatný požadavek pro každý formát a každého dodavatele peněženky.
DCQL tuto mezeru řeší na straně požadavku. Jde o jediný objekt JSON vložený do autorizačního požadavku OpenID4VP, který uvádí jeden nebo více dotazů na osvědčení, každý vázaný na formát a sadu cest k údajům. Peněženka vyhodnotí dotaz vůči uloženým osvědčením, zjistí, která odpovídají, a teprve poté požádá držitele o schválení zpřístupnění právě těchto údajů. Ověřovatel dostane předvídatelnou strukturu bez ohledu na to, jakou peněženku držitel použil.
1. Ověřovatel
Odešle požadavek OpenID4VP s dcql_query
2. Peněženka
Porovná dotaz s uloženými osvědčeními
3. Držitel
Schválí zpřístupnění pouze požadovaných údajů
4. Ověřovatel
Obdrží jednu prezentaci pro každé id dotazu na osvědčení
Struktura dotazu DCQL
Dotaz DCQL je jeden objekt JSON s polem credentials a volitelně s polem credential_sets. Každá položka v credentials je dotaz na osvědčení. Pole označená M jsou v daném dotazu povinná.
dcql_query
credentials[ ]
Jeden dotaz na každé potřebné osvědčení
id + format
Jaké osvědčení a v jakém formátu
meta
Filtr typu, například vct_values
claims[ ]
Cesty k údajům, které se mají zpřístupnit
claim_sets[ ]
Přípustné kombinace údajů
credential_sets[ ]
Volitelné: které kombinace dotazů na osvědčení požadavek splňují
| Pole | Typ | Povinné |
|---|---|---|
| id | string | M |
| format | enum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vc | M |
| meta | objekt, tvar závisí na formátu | |
| claims | pole dotazů na údaje | |
| claim_sets | pole polí id údajů | |
| trusted_authorities | pole objektů s type a values |
Každá položka v claims je sama objektem: id, kterým se na ni odkazuje z claim_sets, path, pole určující umístění údaje v osvědčení (například ["legal_name"] pro údaj SD-JWT na nejvyšší úrovni nebo ["org", "registration_number"] pro vnořený údaj), a volitelně values, seznam hodnot, kterým musí údaj odpovídat.
Praktický příklad: ověření registrace společnosti
Registrace společnosti
dc+sd-jwtOvěřovatel říká: tohle chci dostat
- ✓ Identifikační čísloreg_nopath: ["registration_number"]
- ✓ Obchodní firmalegal_namepath: ["legal_name"]
- ✓ Země registracereg_countrypath: ["registration_country"]
{
"credentials": [
{
"id": "company_registration",
"format": "dc+sd-jwt",
"meta": {
"vct_values": ["urn:eudi:business:company-registration:1"]
},
"claims": [
{ "id": "reg_no", "path": ["registration_number"] },
{ "id": "legal_name", "path": ["legal_name"] },
{ "id": "reg_country", "path": ["registration_country"] }
]
}
]
}Příklad odpovědi peněženky
Peněženka odpoví objektem vp_token, jehož klíči jsou id dotazů na osvědčení. Každá hodnota je pole prezentací. U dc+sd-jwt se prezentace skládá z JWT podepsaného vydavatelem, jednoho disclosure pro každý zpřístupněný údaj a key binding JWT, který ji váže k nonce a klientovi tohoto požadavku.
Co peněženka odešle
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Údaje, které ověřovatel vidí po validaci
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Záložní varianta: claim_sets
claim_sets uvádí skupiny id údajů v pořadí preference. Peněženka vrátí první skupinu, kterou dokáže plně splnit z toho, co držitel skutečně má, takže ověřovatel nemusí posílat dva samostatné požadavky pro přesný a záložní případ.
Praktický příklad: identifikační číslo, nebo záložně jen obchodní firma
1. Preferováno
Vrátí se, pokud osvědčení obsahuje oba údaje
2. Záložní
Vrátí se, jen pokud nelze splnit první sadu
{
"credentials": [
{
"id": "company_registration",
"format": "dc+sd-jwt",
"meta": { "vct_values": ["urn:eudi:business:company-registration:1"] },
"claims": [
{ "id": "reg_no", "path": ["registration_number"] },
{ "id": "legal_name", "path": ["legal_name"] }
],
"claim_sets": [
["reg_no", "legal_name"],
["legal_name"]
]
}
]
}Ověřovatel zde preferuje identifikační číslo spolu s obchodní firmou, ale přijme i samotnou obchodní firmu, pokud osvědčení držitele údaj o identifikačním čísle neobsahuje.
Příklad odpovědi: použila se záložní varianta
Co peněženka odešle
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Údaje, které ověřovatel vidí po validaci
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V."
}Osvědčení držitele neobsahuje identifikační číslo, proto peněženka splnila druhou sadu údajů a zpřístupnila jediný disclosure. Odpověď neuvádí, která sada byla použita: ověřovatel to pozná z údajů, které obdrží.
Kombinace osvědčení: credential_sets
credential_sets funguje o úroveň výše než claim_sets. Každá položka uvádí options, přičemž každá možnost je skupina id dotazů na osvědčení. Peněženka musí splnit jednu možnost z každé povinné položky, což ověřovateli dává logiku AND a OR napříč osvědčeními v jediném požadavku.
Povinné
Registrace společnosti
Jedno z
Registrace k DPH
Jedno z
Potvrzení bankovního účtu
"credential_sets": [
{ "options": [["company_registration"]] },
{ "options": [["vat_registration"], ["bank_account"]] }
]Příklad odpovědi: registrace a bankovní účet
Co peněženka odešle
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
],
"bank_account": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
]
}
}Údaje, které ověřovatel vidí po validaci
{
"company_registration": {
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V."
},
"bank_account": {
"vct": "urn:eudi:business:bank-account:1",
"iban": "NL91ABNA0417164300",
"account_holder": "Example Logistics B.V."
}
}Držitel nemá osvědčení o registraci k DPH, proto peněženka zvolila druhou možnost druhé sady. Id dotazů, které nebyly použity, zde vat_registration, ve vp_token jednoduše chybí.
Pouze důvěryhodní vydavatelé: trusted_authorities
trusted_authorities omezuje dotaz na osvědčení, jejichž vydavatele podporuje autorita, které ověřovatel důvěřuje. Každá položka má type a seznam values: aki pro identifikátor klíče autority, etsi_tl pro důvěryhodný seznam ETSI nebo openid_federation pro kotvu důvěry federace. Peněženka nabízí pouze odpovídající osvědčení.
Praktický příklad: registrace od uvedeného vydavatele
Ověřovatel říká: pouze od vydavatelů z tohoto seznamu důvěryhodných
https://ec.europa.eu/tools/lotl/eu-lotl.xml
Osvědčení o registraci od uvedeného vydavatele
vydavatel je na seznamu důvěryhodných
✓ Odpovídá dotazu
Osvědčení o registraci od neuvedeného vydavatele
vydavatel není na seznamu důvěryhodných
✗ Neodpovídá, držiteli se nenabídne
{
"credentials": [
{
"id": "company_registration",
"format": "dc+sd-jwt",
"meta": { "vct_values": ["urn:eudi:business:company-registration:1"] },
"trusted_authorities": [
{
"type": "etsi_tl",
"values": ["https://ec.europa.eu/tools/lotl/eu-lotl.xml"]
}
],
"claims": [
{ "id": "reg_no", "path": ["registration_number"] },
{ "id": "legal_name", "path": ["legal_name"] }
]
}
]
}Příklad odpovědi: pouze osvědčení uvedeného vydavatele
Co peněženka odešle
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Údaje, které ověřovatel vidí po validaci
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V."
}Držitel měl také osvědčení o registraci od neuvedeného vydavatele, ale peněženka ho nenabídla. trusted_authorities je filtr pro peněženku, nikoli záruka: ověřovatel při validaci prezentace stále sám kontroluje vydavatele vůči důvěryhodnému seznamu.
Shoda hodnoty: claims.values
Dotaz na údaj může obsahovat values, seznam řetězců, celých čísel nebo logických hodnot. Peněženka vrátí údaj pouze tehdy, když jeho typ a hodnota přesně odpovídají jedné z nich, takže ověřovatel může ověřit podmínku, aniž by nejprve žádal o cokoli dalšího.
Praktický příklad: pouze společnosti registrované v Nizozemsku nebo Belgii
Ověřovatel říká: pouze společnost registrovaná v jedné z těchto zemí
Nizozemská společnost
registration_country: "NL"
✓ Odpovídá dotazu
Německá společnost
registration_country: "DE"
✗ Neodpovídá, držiteli se nenabídne
{
"credentials": [
{
"id": "company_registration",
"format": "dc+sd-jwt",
"meta": { "vct_values": ["urn:eudi:business:company-registration:1"] },
"claims": [
{ "id": "legal_name", "path": ["legal_name"] },
{
"id": "reg_country",
"path": ["registration_country"],
"values": ["NL", "BE"]
}
]
}
]
}Příklad odpovědi: nizozemská společnost
Co peněženka odešle
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Údaje, které ověřovatel vidí po validaci
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Osvědčení německé společnosti má registration_country "DE", takže dotaz nesplňuje a peněženka pro něj nemá co vrátit. Ověřovatel by měl hodnotu přesto zkontrolovat ve validovaných údajích a nespoléhat na filtrování v peněžence.
Omezení specifická pro formát v meta
SD-JWT VC: vct_values
U dc+sd-jwt uvádí meta.vct_values identifikátory typů osvědčení, které ověřovatel přijme. Dotaz odpovídá pouze uloženému osvědčení, jehož vct je jednou z uvedených hodnot. Ověřovatel, který důvěřuje jen typu osvědčení o registraci od jednoho vydavatele, uvede přesně tento identifikátor.
mso_mdoc: doctype_value a jmenný prostor
U mso_mdoc určuje meta.doctype_value DocType podle ISO 18013-5 a každá cesta k údaji začíná jmenným prostorem mdoc, do kterého údaj patří, nikoli prostým názvem pole, protože mdoc seskupuje údaje podle jmenných prostorů místo plochého objektu.
Kde DCQL stojí dnes
- DCQL je definován přímo ve specifikaci OpenID4VP, nikoli jako samostatný dokument, a je součástí návrhu od chvíle, kdy byl mechanismus zaveden jako náhrada dřívější závislosti požadavků OpenID4VP na DIF Presentation Exchange.
- EUDI Wallet Architecture and Reference Framework stanoví OpenID4VP jako prezentační protokol a spolu s ním DCQL jako dotazovací mechanismus, který mají spoléhající se strany a peněženky v ekosystému podporovat.
- Referenční implementace peněženek a ověřovatelů v programu EUDI Wallet Reference Implementation se sjednotily na DCQL. Nové integrace firemních peněženek postavené dnes na OpenID4VP by proto měly jako formát dotazů v požadavcích na prezentaci počítat s DCQL, nikoli s Presentation Exchange.
Související pojmy
Často kladené otázky
Jak se DCQL liší od DIF Presentation Exchange?
Obojí popisuje, co ověřovatel od peněženky požaduje, ale DCQL je omezen na OpenID4VP a definován přímo v této specifikaci, zatímco Presentation Exchange je samostatná specifikace DIF, která pokrývá i další protokoly. DCQL je záměrně menší: nemá skupiny input descriptorů ani submission requirements a omezení specifická pro formát, například mdoc doctype nebo typ SD-JWT VC, vyjadřuje přímo v objektu dotazu, nikoli prostřednictvím obecného filtru JSON Schema. Ekosystém EUDI Wallet standardizoval DCQL pro prezentace OpenID4VP.
Může jeden dotaz DCQL požadovat více než jedno osvědčení?
Ano. Pole credentials může obsahovat několik dotazů na osvědčení, každý s vlastním id. Peněženka, která má shodu pro všechny položky, vrátí jednu prezentaci pro každou položku. Volitelný objekt credential_sets pak může vyžadovat konkrétní kombinace, například přijmout buď samotné osvědčení o registraci společnosti, nebo osvědčení o registraci společnosti spolu s prohlášením o UBO, aniž by se držitele ptal dvakrát.
Jaký problém řeší claim_sets v rámci jednoho dotazu na osvědčení?
Osvědčení nemusí vždy obsahovat všechny údaje, které by ověřovatel chtěl. claim_sets uvádí alternativní skupiny id údajů, z nichž každá by sama o sobě požadavek splnila, seřazené od nejvíce po nejméně preferovanou. Peněženka vybere první skupinu, kterou dokáže plně splnit z údajů, které držitel skutečně má. Ověřovatel tak může požádat o přesné číslo průkazu, pokud je k dispozici, a jinak se spokojit s hrubší kontrolou, například příznakem věku nad 18 let, aniž by posílal dva samostatné požadavky.
Je DCQL určen pouze pro EUDI Wallet?
Ne. DCQL je součástí základní specifikace OpenID4VP a může jej používat jakákoli implementace OpenID4VP. Ekosystém EUDI Wallet je jeho významným uživatelem: Architecture and Reference Framework stanoví OpenID4VP s DCQL jako prezentační mechanismus, který musí spoléhající se strany podporovat. Proto je DCQL důležitý zejména pro peněženky a ověřovatele určené pro evropský trh.
Provádí DCQL sám selektivní zpřístupnění?
Ne. DCQL pouze popisuje, co se požaduje. Zda peněženka dokáže zpřístupnit právě tyto údaje a nic dalšího, závisí na formátu osvědčení: SD-JWT VC i ISO mdoc podporují zpřístupnění podmnožiny svých údajů, takže pole claims v DCQL na tuto podporu navazuje. DCQL by fungoval i s formátem bez selektivního zpřístupnění, ale držitel by pak musel i pro dotaz na jediný údaj zpřístupnit celé osvědčení.
Zdroje
Tato stránka má informativní charakter a nepředstavuje právní poradenství. Závazné informace získáte přímo od OpenID Foundation a Evropské komise.