DCQL lahti seletatuna: kuidas kontrollija küsib rahakotilt täpselt seda, mida vajab
Digital Credentials Query Language ehk DCQL on JSON-päringuvorming, mida OpenID4VP kasutab esitluspäringus. Sellega saab usaldav osapool kirjeldada, milliseid tõendeid ja milliseid nende väiteid ta näha soovib, nii et iga nõuetele vastav rahakott suudab päringut töödelda ilma eriintegratsioonita.
Probleem, mida DCQL lahendab
Ärirahakotis võib olla eri vormingus tõendeid: SD-JWT VC vormingus äriregistri tõend, mdoc-kodeeritud kutsekvalifikatsioon või varasema piloodi W3C kontrollitav tõend. Kontrollijal, kes vajab ainult registrikoodi ja ärinime kinnitust, puudub vormingute ülene viis küsida täpselt seda. Ta peab kas aktsepteerima kogu tõendi või koostama käsitsi eraldi päringu iga vormingu ja iga rahakoti tarnija jaoks.
DCQL lahendab selle probleemi päringu poolel. See on üks JSON-objekt OpenID4VP autoriseerimispäringus, mis nimetab ühe või mitu tõendipäringut, millest igaüks on seotud kindla vormingu ja väidete teedega. Rahakott hindab päringut salvestatud tõendite suhtes, selgitab välja sobivad tõendid ja alles siis palub omanikul kinnitada just nende väidete avaldamise. Kontrollija saab alati ettearvatava struktuuri, sõltumata sellest, millist rahakotti omanik kasutas.
1. Kontrollija
Saadab OpenID4VP päringu koos dcql_query objektiga
2. Rahakott
Võrdleb päringut salvestatud tõenditega
3. Omanik
Kinnitab ainult küsitud väidete avaldamise
4. Kontrollija
Saab iga tõendipäringu id kohta ühe esitluse
DCQL päringu ülesehitus
DCQL päring on üks JSON-objekt, milles on credentials massiiv ja valikuliselt credential_sets massiiv. Iga credentials kirje on tõendipäring. M-tähisega väljad on selles päringus kohustuslikud.
dcql_query
credentials[ ]
Üks tõendipäring iga vajaliku tõendi kohta
id + format
Milline tõend ja millises vormingus
meta
Tüübifilter, näiteks vct_values
claims[ ]
Avaldatavate väidete teed
claim_sets[ ]
Lubatud väidete kombinatsioonid
credential_sets[ ]
Valikuline: millised tõendipäringute kombinatsioonid päringu rahuldavad
| Väli | Tüüp | Kohustuslik |
|---|---|---|
| id | string | M |
| format | enum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vc | M |
| meta | objekt, kuju sõltub vormingust | |
| claims | väitepäringute massiiv | |
| claim_sets | väidete id-de massiivide massiiv | |
| trusted_authorities | objektide massiiv, millel on type ja values |
Iga claims kirje on omakorda objekt: id, millega sellele claim_sets'is viidatakse, path, massiiv, mis määrab väite asukoha tõendis (näiteks ["legal_name"] SD-JWT ülemise taseme väite puhul või ["org", "registration_number"] pesastatud väite puhul), ning valikuliselt values, väärtuste loend, millest ühele väide peab vastama.
Näide: äriregistri andmete kontroll
Äriregistri andmed
dc+sd-jwtKontrollija ütleb: seda ma soovin saada
- ✓ Registrikoodreg_nopath: ["registration_number"]
- ✓ Ärinimilegal_namepath: ["legal_name"]
- ✓ Registreerimisriikreg_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"] }
]
}
]
}Rahakoti vastuse näide
Rahakott vastab vp_token objektiga, mille võtmed on tõendipäringute id-d. Iga väärtus on esitluste massiiv. dc+sd-jwt puhul koosneb esitlus väljaandja allkirjastatud JWT-st, iga avaldatud väite kohta ühest disclosure'ist ja key binding JWT-st, mis seob esitluse selle päringu nonce'i ja kliendiga.
Mida rahakott saadab
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Väited, mida kontrollija pärast valideerimist näeb
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Varuvariandi küsimine: claim_sets
claim_sets loetleb väidete id-de grupid eelistuse järjekorras. Rahakott tagastab esimese grupi, mille ta saab omaniku tegelike andmete põhjal täielikult rahuldada, nii et kontrollija ei pea täpse ja varujuhtumi jaoks saatma kahte eraldi päringut.
Näide: registrikood või varuvariandina ainult ärinimi
1. Eelistatud
Tagastatakse, kui tõendis on mõlemad väited
2. Varuvariant
Tagastatakse ainult siis, kui esimest komplekti ei saa rahuldada
{
"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"]
]
}
]
}Siin eelistab kontrollija registrikoodi koos ärinimega, kuid aktsepteerib ka ainult ärinime, kui omaniku tõendis registrikoodi väidet ei ole.
Vastuse näide: kasutati varuvarianti
Mida rahakott saadab
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Väited, mida kontrollija pärast valideerimist näeb
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V."
}Omaniku tõendis ei ole registrikoodi, seega rahuldas rahakott teise väidete komplekti ja avaldas ühe disclosure'i. Vastus ei ütle, millist komplekti kasutati: kontrollija näeb seda saadud väidetest.
Tõendite kombineerimine: credential_sets
credential_sets toimib claim_sets'ist ühe taseme võrra kõrgemal. Iga kirje loetleb options, kus iga valik on tõendipäringute id-de grupp. Rahakott peab rahuldama iga nõutud kirje ühe valiku, mis annab kontrollijale ühes päringus tõendite ülese JA ning VÕI loogika.
Nõutud
Äriregistri andmed
Üks neist
KMKR registreering
Üks neist
Pangakonto kinnitus
"credential_sets": [
{ "options": [["company_registration"]] },
{ "options": [["vat_registration"], ["bank_account"]] }
]Vastuse näide: registriandmed ja pangakonto
Mida rahakott saadab
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
],
"bank_account": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
]
}
}Väited, mida kontrollija pärast valideerimist näeb
{
"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."
}
}Omanikul ei ole KMKR registreeringu tõendit, seega valis rahakott teise komplekti teise valiku. Kasutamata päringu id-d, siin vat_registration, lihtsalt puuduvad vp_token objektist.
Ainult usaldusväärsed väljaandjad: trusted_authorities
trusted_authorities kitsendab tõendipäringu tõenditele, mille väljaandjat toetab kontrollija usaldatav asutus. Igal kirjel on type ja values loend: aki asutuse võtmeidentifikaatori jaoks, etsi_tl ETSI usaldusnimekirja jaoks või openid_federation föderatsiooni usaldusankru jaoks. Rahakott pakub ainult sobivaid tõendeid.
Näide: registritõend nimekirjas olevalt väljaandjalt
Kontrollija ütleb: ainult selle usaldusnimekirja väljaandjatelt
https://ec.europa.eu/tools/lotl/eu-lotl.xml
Registritõend nimekirjas olevalt väljaandjalt
väljaandja on usaldusnimekirjas
✓ Vastab päringule
Registritõend nimekirjast puuduvalt väljaandjalt
väljaandja ei ole usaldusnimekirjas
✗ Ei vasta, omanikule ei pakuta
{
"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"] }
]
}
]
}Vastuse näide: ainult nimekirjas oleva väljaandja tõend
Mida rahakott saadab
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Väited, mida kontrollija pärast valideerimist näeb
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V."
}Omanikul oli ka nimekirjast puuduva väljaandja registritõend, kuid rahakott seda ei pakkunud. trusted_authorities on rahakoti filter, mitte garantii: kontrollija kontrollib esitluse valideerimisel väljaandjat ise usaldusnimekirja alusel.
Väärtuse sobitamine: claims.values
Väitepäring võib sisaldada values loendit, mis koosneb stringidest, täisarvudest või tõeväärtustest. Rahakott tagastab väite ainult siis, kui selle tüüp ja väärtus vastavad täpselt ühele neist, nii et kontrollija saab tingimust kontrollida ilma midagi muud eelnevalt küsimata.
Näide: ainult Hollandis või Belgias registreeritud ettevõtted
Kontrollija ütleb: ainult ühes neist riikidest registreeritud ettevõte
Hollandi ettevõte
registration_country: "NL"
✓ Vastab päringule
Saksa ettevõte
registration_country: "DE"
✗ Ei vasta, omanikule ei pakuta
{
"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"]
}
]
}
]
}Vastuse näide: Hollandi ettevõte
Mida rahakott saadab
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Väited, mida kontrollija pärast valideerimist näeb
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Saksa ettevõtte tõendis on registration_country väärtus "DE", seega ei rahulda see päringut ja rahakotil pole selle kohta midagi tagastada. Kontrollija peaks siiski kontrollima väärtust valideeritud väidetes, mitte lootma rahakoti filtreerimisele.
Vormingupõhised piirangud väljal meta
SD-JWT VC: vct_values
dc+sd-jwt puhul loetleb meta.vct_values tõenditüüpide identifikaatorid, mida kontrollija aktsepteerib. Päring vastab ainult salvestatud tõendile, mille vct on üks loetletud väärtustest. Kontrollija, kes usaldab ainult ühe väljaandja registritõendi tüüpi, loetleb täpselt selle identifikaatori.
mso_mdoc: doctype_value ja nimeruum
mso_mdoc puhul määrab meta.doctype_value ISO 18013-5 DocType'i ning iga väite path algab mdoc nimeruumiga, kuhu väide kuulub, mitte lihtsalt välja nimega, sest mdoc rühmitab väited nimeruumidesse, mitte lamedasse objekti.
DCQL-i praegune seis
- DCQL on defineeritud OpenID4VP spetsifikatsiooni sees, mitte eraldi dokumendina, ja on olnud mustandi osa alates sellest, kui mehhanism võeti kasutusele, et asendada OpenID4VP päringute varasem sõltuvus DIF Presentation Exchange'ist.
- EUDI Wallet Architecture and Reference Framework määrab esitlusprotokolliks OpenID4VP ja koos sellega päringumehhanismiks DCQL-i, mida ökosüsteemi usaldavad osapooled ja rahakotid peavad toetama.
- EUDI Wallet Reference Implementation programmi rahakoti ja kontrollija referentsteostused on koondunud DCQL-i ümber. Seetõttu peaksid uued OpenID4VP-l põhinevad ärirahakoti integratsioonid eeldama esitluspäringute vorminguna DCQL-i, mitte Presentation Exchange'i.
Seotud mõisted
Korduma kippuvad küsimused
Mille poolest erineb DCQL DIF Presentation Exchange'ist?
Mõlemad kirjeldavad, mida kontrollija rahakotilt soovib, kuid DCQL on piiratud OpenID4VP-ga ja defineeritud otse selles spetsifikatsioonis, samas kui Presentation Exchange on eraldi DIF-i spetsifikatsioon, mis katab ka teisi protokolle. DCQL on teadlikult väiksem: selles puuduvad sisendkirjelduste grupid ja esitamisnõuded ning vormingupõhised piirangud, näiteks mdoc doctype või SD-JWT VC tüüp, väljendatakse otse päringuobjektis, mitte üldise JSON Schema filtri kaudu. EUDI Walleti ökosüsteem on OpenID4VP esitluste jaoks standardiseerinud DCQL-i.
Kas üks DCQL päring saab küsida rohkem kui ühte tõendit?
Jah. Massiiv credentials võib sisaldada mitut tõendipäringut, igaüks oma id-ga. Rahakott, milles on vasted kõigile kirjetele, tagastab iga kirje kohta ühe esitluse. Valikuline credential_sets objekt võib lisaks nõuda kindlaid kombinatsioone, näiteks lubada kas ainult äriregistri tõendit või äriregistri tõendit koos UBO deklaratsiooniga, ilma et omanikult peaks kaks korda küsima.
Millist probleemi lahendab claim_sets ühe tõendipäringu sees?
Tõendis ei ole alati kõiki väiteid, mida kontrollija soovib. claim_sets loetleb alternatiivsed väidete id-de grupid, millest igaüks rahuldaks päringu iseseisvalt, järjestatuna kõige eelistatumast kõige vähem eelistatuni. Rahakott valib esimese grupi, mille ta saab omaniku tegelikest väidetest täielikult rahuldada. Nii saab kontrollija küsida võimalusel täpset isikukoodi ja kasutada varuvariandina üldisemat kontrolli, näiteks üle 18 aasta vanuse lippu, ilma kahte eraldi päringut saatmata.
Kas DCQL on mõeldud ainult EUDI Walleti jaoks?
Ei. DCQL on osa OpenID4VP põhispetsifikatsioonist ja iga OpenID4VP teostus saab seda kasutada. EUDI Walleti ökosüsteem on selle silmapaistev kasutaja: Architecture and Reference Framework määrab OpenID4VP koos DCQL-iga esitlusmehhanismiks, mida usaldavad osapooled peavad toetama. Seetõttu on see eriti oluline Euroopa turu jaoks loodud rahakottide ja kontrollijate puhul.
Kas DCQL ise teostab valikulist avalikustamist?
Ei. DCQL kirjeldab ainult seda, mida küsitakse. See, kas rahakott saab avaldada täpselt need väited ja mitte midagi muud, sõltub tõendi vormingust: nii SD-JWT VC kui ka ISO mdoc toetavad väidete alamhulga avaldamist, nii et DCQL-i claims massiiv kasutab seda tuge. DCQL töötaks ka vormingu puhul, mis valikulist avalikustamist ei toeta, kuid siis peaks omanik isegi ühe väitega päringu rahuldamiseks avaldama kogu tõendi.
Allikad
See leht on informatiivne ega ole õigusnõuanne. Autoriteetsete juhiste saamiseks pöörduge otse OpenID Foundationi ja Euroopa Komisjoni poole.