DCQL razložen: kako preveritelj od denarnice zahteva natanko to, kar potrebuje
Digital Credentials Query Language, DCQL, je oblika poizvedb v JSON, ki jo OpenID4VP uporablja v zahtevi za predstavitev. Zanašajoči se stranki omogoča, da opiše, katere poverilnice in katere podatke v njih želi videti, in sicer tako, da jo lahko razčleni vsaka skladna denarnica brez namenske integracije.
Težava, ki jo rešuje DCQL
Poslovna denarnica lahko hrani poverilnice v več oblikah: registracijo podjetja kot SD-JWT VC, poklicno kvalifikacijo, kodirano kot mdoc, ali preverljivo poverilnico W3C iz zgodnejšega pilota. Preveritelj, ki mora potrditi le matično številko in firmo, nima prenosljivega načina, da bi prek različnih oblik zahteval natanko to. Sprejeti mora celotno poverilnico ali pa ročno sprogramirati ločeno zahtevo za vsako obliko in vsakega ponudnika denarnice.
DCQL to vrzel zapolni na strani zahteve. Gre za en objekt JSON, vdelan v avtorizacijsko zahtevo OpenID4VP, ki navaja eno ali več poizvedb po poverilnicah, vsaka vezana na obliko in nabor poti do podatkov. Denarnica ovrednoti poizvedbo glede na shranjene poverilnice, ugotovi, katere ustrezajo, in šele nato imetnika prosi, da odobri razkritje prav teh podatkov. Preveritelj dobi predvidljivo strukturo ne glede na to, katero denarnico je imetnik uporabil.
1. Preveritelj
Pošlje zahtevo OpenID4VP z dcql_query
2. Denarnica
Primerja poizvedbo s shranjenimi poverilnicami
3. Imetnik
Odobri razkritje samo zahtevanih podatkov
4. Preveritelj
Prejme eno predstavitev za vsak id poizvedbe po poverilnici
Zgradba poizvedbe DCQL
Poizvedba DCQL je en objekt JSON s poljem credentials in neobvezno s poljem credential_sets. Vsak vnos v credentials je poizvedba po poverilnici. Polja, označena z M, so v tej poizvedbi obvezna.
dcql_query
credentials[ ]
Ena poizvedba za vsako potrebno poverilnico
id + format
Katera poverilnica in v kateri obliki
meta
Filter tipa, na primer vct_values
claims[ ]
Poti do podatkov za razkritje
claim_sets[ ]
Sprejemljive kombinacije podatkov
credential_sets[ ]
Neobvezno: katere kombinacije poizvedb po poverilnicah izpolnijo zahtevo
| Polje | Tip | Obvezno |
|---|---|---|
| id | string | M |
| format | enum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vc | M |
| meta | objekt, oblika je odvisna od formata | |
| claims | polje poizvedb po podatkih | |
| claim_sets | polje polj id podatkov | |
| trusted_authorities | polje objektov s type in values |
Vsak vnos v claims je tudi sam objekt: id, s katerim se nanj sklicuje claim_sets, path, polje, ki določa mesto podatka v poverilnici (na primer ["legal_name"] za podatek SD-JWT na najvišji ravni ali ["org", "registration_number"] za gnezdenega), in neobvezno values, seznam vrednosti, ki jim mora podatek ustrezati.
Praktični primer: preverjanje registracije podjetja
Registracija podjetja
dc+sd-jwtPreveritelj pravi: to želim prejeti
- ✓ Matična številkareg_nopath: ["registration_number"]
- ✓ Firmalegal_namepath: ["legal_name"]
- ✓ Država registracijereg_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"] }
]
}
]
}Primer odgovora denarnice
Denarnica odgovori z objektom vp_token, katerega ključi so id poizvedb po poverilnicah. Vsaka vrednost je polje predstavitev. Pri dc+sd-jwt je predstavitev sestavljena iz JWT, ki ga je podpisal izdajatelj, enega disclosure za vsak razkrit podatek in key binding JWT, ki predstavitev veže na nonce in odjemalca te zahteve.
Kaj pošlje denarnica
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Podatki, ki jih preveritelj vidi po validaciji
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Nadomestna možnost: claim_sets
claim_sets navaja skupine id podatkov po vrstnem redu prednosti. Denarnica vrne prvo skupino, ki jo lahko v celoti izpolni s tem, kar imetnik dejansko ima, zato preveritelju ni treba pošiljati dveh ločenih zahtev za natančen in nadomestni primer.
Praktični primer: matična številka ali nadomestno samo firma
1. Prednostno
Vrne se, ko poverilnica vsebuje oba podatka
2. Nadomestno
Vrne se samo, če prvega nabora ni mogoče izpolniti
{
"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"]
]
}
]
}Tu preveritelj daje prednost matični številki skupaj s firmo, sprejme pa tudi samo firmo, če imetnikova poverilnica ne vsebuje podatka o matični številki.
Primer odgovora: uporabljena je bila nadomestna možnost
Kaj pošlje denarnica
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Podatki, ki jih preveritelj vidi po validaciji
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V."
}Imetnikova poverilnica nima matične številke, zato je denarnica izpolnila drugi nabor podatkov in razkrila en sam disclosure. Odgovor ne navaja, kateri nabor je bil uporabljen: preveritelj to razbere iz prejetih podatkov.
Kombiniranje poverilnic: credential_sets
credential_sets deluje eno raven višje kot claim_sets. Vsak vnos navaja options, pri čemer je vsaka možnost skupina id poizvedb po poverilnicah. Denarnica mora izpolniti eno možnost vsakega obveznega vnosa, kar preveritelju omogoča logiko IN in ALI prek več poverilnic v eni sami zahtevi.
Obvezno
Registracija podjetja
Eno od
Registracija za DDV
Eno od
Potrdilo o bančnem računu
"credential_sets": [
{ "options": [["company_registration"]] },
{ "options": [["vat_registration"], ["bank_account"]] }
]Primer odgovora: registracija in bančni račun
Kaj pošlje denarnica
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
],
"bank_account": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
]
}
}Podatki, ki jih preveritelj vidi po validaciji
{
"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."
}
}Imetnik nima poverilnice o registraciji za DDV, zato je denarnica izbrala drugo možnost drugega nabora. Id poizvedb, ki niso bili uporabljeni, tu vat_registration, v vp_token preprosto manjkajo.
Samo zaupanja vredni izdajatelji: trusted_authorities
trusted_authorities omeji poizvedbo na poverilnice, katerih izdajatelja podpira organ, ki mu preveritelj zaupa. Vsak vnos ima type in seznam values: aki za identifikator ključa organa, etsi_tl za seznam zaupanja ETSI ali openid_federation za sidro zaupanja federacije. Denarnica ponudi samo ustrezne poverilnice.
Praktični primer: registracija od izdajatelja s seznama
Preveritelj pravi: samo od izdajateljev s tega seznama zaupanja
https://ec.europa.eu/tools/lotl/eu-lotl.xml
Poverilnica o registraciji od izdajatelja s seznama
izdajatelj je na seznamu zaupanja
✓ Ustreza poizvedbi
Poverilnica o registraciji od izdajatelja, ki ni na seznamu
izdajatelj ni na seznamu zaupanja
✗ Ne ustreza, imetniku ni ponujeno
{
"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"] }
]
}
]
}Primer odgovora: samo poverilnica izdajatelja s seznama
Kaj pošlje denarnica
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Podatki, ki jih preveritelj vidi po validaciji
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V."
}Imetnik je imel tudi poverilnico o registraciji od izdajatelja, ki ni na seznamu, vendar je denarnica ni ponudila. trusted_authorities je filter za denarnico, ne jamstvo: preveritelj pri validaciji predstavitve izdajatelja še vedno sam preveri glede na seznam zaupanja.
Ujemanje vrednosti: claims.values
Poizvedba po podatku lahko vsebuje values, seznam nizov, celih števil ali logičnih vrednosti. Denarnica podatek vrne samo, če se njegov tip in vrednost natančno ujemata z eno od njih, zato lahko preveritelj preveri pogoj, ne da bi prej zahteval kar koli drugega.
Praktični primer: samo podjetja, registrirana na Nizozemskem ali v Belgiji
Preveritelj pravi: samo podjetje, registrirano v eni od teh držav
Nizozemsko podjetje
registration_country: "NL"
✓ Ustreza poizvedbi
Nemško podjetje
registration_country: "DE"
✗ Ne ustreza, imetniku ni ponujeno
{
"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"]
}
]
}
]
}Primer odgovora: nizozemsko podjetje
Kaj pošlje denarnica
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Podatki, ki jih preveritelj vidi po validaciji
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Poverilnica nemškega podjetja ima registration_country "DE", zato ne izpolnjuje poizvedbe in denarnica zanjo nima česa vrniti. Preveritelj naj vrednost kljub temu preveri v validiranih podatkih in se ne zanaša na filtriranje v denarnici.
Omejitve, specifične za obliko, v meta
SD-JWT VC: vct_values
Pri dc+sd-jwt meta.vct_values navaja identifikatorje tipov poverilnic, ki jih preveritelj sprejema. Poizvedba ustreza samo shranjeni poverilnici, katere vct je ena od navedenih vrednosti. Preveritelj, ki zaupa samo tipu poverilnice o registraciji enega izdajatelja, navede natanko ta identifikator.
mso_mdoc: doctype_value in imenski prostor
Pri mso_mdoc meta.doctype_value določa DocType po ISO 18013-5, vsaka pot do podatka pa se začne z imenskim prostorom mdoc, v katerega podatek spada, in ne s preprostim imenom polja, saj mdoc podatke združuje po imenskih prostorih namesto v plosk objekt.
Kje je DCQL danes
- DCQL je opredeljen v sami specifikaciji OpenID4VP, ne kot ločen dokument, in je del osnutka, odkar je bil mehanizem uveden kot nadomestilo za prejšnjo odvisnost zahtev OpenID4VP od DIF Presentation Exchange.
- EUDI Wallet Architecture and Reference Framework določa OpenID4VP kot protokol predstavitve in z njim DCQL kot poizvedbeni mehanizem, ki naj ga podpirajo zanašajoče se stranke in denarnice v ekosistemu.
- Referenčne implementacije denarnic in preveriteljev v programu EUDI Wallet Reference Implementation so se poenotile okoli DCQL. Nove integracije poslovnih denarnic, zgrajene danes na OpenID4VP, naj zato kot obliko poizvedb v zahtevah za predstavitev predvidijo DCQL in ne Presentation Exchange.
Sorodni pojmi
Pogosta vprašanja
Po čem se DCQL razlikuje od DIF Presentation Exchange?
Oba opisujeta, kaj preveritelj želi od denarnice, vendar je DCQL omejen na OpenID4VP in opredeljen neposredno v tej specifikaciji, Presentation Exchange pa je ločena specifikacija DIF, ki zajema tudi druge protokole. DCQL je namenoma manjši: nima skupin input descriptorjev ali submission requirements, omejitve, specifične za obliko, na primer mdoc doctype ali tip SD-JWT VC, pa izraža neposredno v objektu poizvedbe namesto prek splošnega filtra JSON Schema. Ekosistem EUDI Wallet je DCQL standardiziral za predstavitve OpenID4VP.
Ali lahko ena poizvedba DCQL zahteva več kot eno poverilnico?
Da. Polje credentials lahko vsebuje več poizvedb po poverilnicah, vsako s svojim id. Denarnica, ki ima ujemanja za vse vnose, vrne eno predstavitev za vsak vnos. Neobvezni objekt credential_sets lahko poleg tega zahteva določene kombinacije, na primer sprejme bodisi samo poverilnico o registraciji podjetja bodisi poverilnico o registraciji podjetja skupaj z izjavo o UBO, ne da bi imetnika vprašal dvakrat.
Katero težavo rešuje claim_sets znotraj ene poizvedbe po poverilnici?
Poverilnica ne vsebuje vedno vseh podatkov, ki bi jih preveritelj želel. claim_sets navaja alternativne skupine id podatkov, od katerih bi vsaka sama izpolnila zahtevo, razvrščene od najbolj do najmanj zaželene. Denarnica izbere prvo skupino, ki jo lahko v celoti izpolni s podatki, ki jih imetnik dejansko ima. Tako lahko preveritelj zahteva natančno številko osebnega dokumenta, kadar je na voljo, sicer pa se zadovolji z grobejšim preverjanjem, na primer oznako starosti nad 18 let, brez pošiljanja dveh ločenih zahtev.
Ali je DCQL namenjen samo EUDI Wallet?
Ne. DCQL je del osnovne specifikacije OpenID4VP in ga lahko uporablja katera koli implementacija OpenID4VP. Ekosistem EUDI Wallet je njegov vidnejši uporabnik: Architecture and Reference Framework določa OpenID4VP z DCQL kot mehanizem predstavitve, ki ga morajo podpirati zanašajoče se stranke. Zato je še posebej pomemben za denarnice in preveritelje, razvite za evropski trg.
Ali DCQL sam izvaja selektivno razkritje?
Ne. DCQL le opisuje, kaj se zahteva. Ali lahko denarnica razkrije natanko te podatke in nič drugega, je odvisno od oblike poverilnice: SD-JWT VC in ISO mdoc podpirata razkritje podmnožice podatkov, zato se polje claims v DCQL naslanja na to podporo. DCQL bi deloval tudi pri obliki brez selektivnega razkritja, vendar bi moral imetnik celo za poizvedbo po enem samem podatku razkriti celotno poverilnico.
Viri
Ta stran je informativne narave in ne predstavlja pravnega nasveta. Za verodostojne smernice se obrnite neposredno na OpenID Foundation in Evropsko komisijo.