DCQL selitettynä: näin todentaja pyytää lompakolta juuri sen, mitä tarvitsee
Digital Credentials Query Language eli DCQL on JSON-kyselymuoto, jota OpenID4VP käyttää esityspyynnön sisällä. Sen avulla luottava osapuoli voi kuvata, mitä todisteita ja mitä niiden tietoja se haluaa nähdä, tavalla, jonka mikä tahansa yhteensopiva lompakko osaa tulkita ilman räätälöityä integraatiota.
Ongelma, jonka DCQL ratkaisee
Yrityslompakossa voi olla todisteita useassa muodossa: SD-JWT VC -muotoinen yritysrekisteröinti, mdoc-koodattu ammattipätevyys tai aiemman pilotin W3C-todennettava todiste. Todentajalla, jonka tarvitsee vain varmistaa rekisterinumero ja virallinen nimi, ei ole siirrettävää tapaa pyytää juuri niitä eri muodoista. Sen on joko hyväksyttävä koko todiste tai koodattava erillinen pyyntö jokaiselle muodolle ja lompakkotoimittajalle.
DCQL korjaa tämän aukon pyyntöpuolella. Se on yksi JSON-objekti, joka upotetaan OpenID4VP-valtuutuspyyntöön ja joka nimeää yhden tai useamman todistekyselyn, joista kukin on sidottu muotoon ja joukkoon tietopolkuja. Lompakko arvioi kyselyn tallennettuja todisteita vasten, selvittää, mitkä vastaavat, ja pyytää vasta sitten haltijaa hyväksymään juuri näiden tietojen luovutuksen. Todentaja saa ennustettavan rakenteen riippumatta siitä, mitä lompakkoa haltija käytti.
1. Todentaja
Lähettää OpenID4VP-pyynnön, jossa on dcql_query
2. Lompakko
Vertaa kyselyä tallennettuihin todisteisiin
3. Haltija
Hyväksyy vain pyydettyjen tietojen luovutuksen
4. Todentaja
Saa yhden esityksen kutakin kyselyn id:tä kohden
DCQL-kyselyn rakenne
DCQL-kysely on yksi JSON-objekti, jossa on credentials-taulukko ja valinnaisesti credential_sets-taulukko. Jokainen credentials-taulukon kohta on todistekysely. M-merkityt kentät ovat kyselyssä pakollisia.
dcql_query
credentials[ ]
Yksi todistekysely jokaista tarvittavaa todistetta kohden
id + format
Mikä todiste ja missä muodossa
meta
Tyyppisuodatin, kuten vct_values
claims[ ]
Luovutettavien tietojen polut
claim_sets[ ]
Hyväksyttävät tietoyhdistelmät
credential_sets[ ]
Valinnainen: mitkä todistekyselyjen yhdistelmät täyttävät pyynnön
| Kenttä | Tyyppi | Pakollinen |
|---|---|---|
| id | string | M |
| format | enum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vc | M |
| meta | objekti, rakenne riippuu muodosta | |
| claims | taulukko tietokyselyjä | |
| claim_sets | taulukko tieto-id-taulukoita | |
| trusted_authorities | taulukko objekteja, joilla on tyyppi ja arvot |
Jokainen claims-taulukon kohta on itsessään objekti: id, jolla siihen viitataan claim_sets-joukoista, path eli taulukko, joka paikantaa tiedon todisteessa (esimerkiksi ["legal_name"] ylimmän tason SD-JWT-tiedolle tai ["org", "registration_number"] sisäkkäiselle tiedolle), sekä valinnaisesti values eli luettelo arvoista, joihin tiedon on täsmättävä.
Esimerkki: yritysrekisteröinnin tarkistus
Yritysrekisteröinti
dc+sd-jwtTodentaja sanoo: tämän haluan saada
- ✓ Rekisterinumeroreg_nopath: ["registration_number"]
- ✓ Virallinen nimilegal_namepath: ["legal_name"]
- ✓ Rekisteröintimaareg_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"] }
]
}
]
}Esimerkkivastaus lompakolta
Lompakko vastaa vp_token-objektilla, jonka avaimina ovat todistekyselyjen id:t. Kukin arvo on taulukko esityksiä. dc+sd-jwt-muodossa esitys koostuu myöntäjän allekirjoittamasta JWT:stä, yhdestä disclosuresta jokaista luovutettua tietoa kohden sekä key binding JWT:stä, joka sitoo sen tämän pyynnön nonceen ja asiakkaaseen.
Mitä lompakko lähettää
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Tiedot, jotka todentaja näkee validoinnin jälkeen
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Varavaihtoehdon pyytäminen: claim_sets
claim_sets luettelee tieto-id-ryhmiä suosituimmuusjärjestyksessä. Lompakko palauttaa ensimmäisen ryhmän, jonka se voi täyttää kokonaan haltijan todellisilla tiedoilla, joten todentajan ei tarvitse lähettää kahta erillistä pyyntöä tarkalle tapaukselle ja varatapaukselle.
Esimerkki: rekisterinumero tai varalla pelkkä virallinen nimi
1. Ensisijainen
Palautetaan, kun todisteessa on molemmat tiedot
2. Varavaihtoehto
Palautetaan vain, jos ensimmäistä joukkoa ei voi täyttää
{
"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"]
]
}
]
}Tässä todentaja haluaa ensisijaisesti rekisterinumeron ja virallisen nimen, mutta hyväksyy pelkän virallisen nimen, jos haltijan todisteessa ei ole rekisterinumerotietoa.
Esimerkkivastaus: varavaihtoehtoa käytettiin
Mitä lompakko lähettää
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Tiedot, jotka todentaja näkee validoinnin jälkeen
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V."
}Haltijan todisteessa ei ole rekisterinumeroa, joten lompakko täytti toisen tietojoukon ja luovutti yhden disclosuren. Vastauksessa ei kerrota, mitä joukkoa käytettiin: todentaja päättelee sen saamistaan tiedoista.
Todisteiden yhdistäminen: credential_sets
credential_sets toimii tasoa ylempänä kuin claim_sets. Jokainen kohta luettelee options-vaihtoehtoja, joista kukin on ryhmä todistekyselyjen id:itä. Lompakon on täytettävä yksi vaihtoehto jokaisesta pakollisesta kohdasta, mikä antaa todentajalle JA- ja TAI-logiikan todisteiden välillä yhdessä pyynnössä.
Pakollinen
Yritysrekisteröinti
Yksi näistä
ALV-rekisteröinti
Yksi näistä
Pankkitilitodiste
"credential_sets": [
{ "options": [["company_registration"]] },
{ "options": [["vat_registration"], ["bank_account"]] }
]Esimerkkivastaus: rekisteröinti ja pankkitili
Mitä lompakko lähettää
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
],
"bank_account": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
]
}
}Tiedot, jotka todentaja näkee validoinnin jälkeen
{
"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."
}
}Haltijalla ei ole ALV-rekisteröintitodistetta, joten lompakko valitsi toisen joukon toisen vaihtoehdon. Käyttämättömät kyselyn id:t, tässä vat_registration, yksinkertaisesti puuttuvat vp_tokenista.
Vain luotetut myöntäjät: trusted_authorities
trusted_authorities rajaa todistekyselyn todisteisiin, joiden myöntäjän taustalla on todentajan luottama taho. Jokaisella kohdalla on tyyppi ja arvoluettelo: aki valtuutetun tahon avaintunnisteelle, etsi_tl ETSI-luotettujen listalle tai openid_federation federaation luottamusankkurille. Lompakko tarjoaa vain vastaavia todisteita.
Esimerkki: rekisteröinti listatulta myöntäjältä
Todentaja sanoo: vain tämän luotettujen listan myöntäjiltä
https://ec.europa.eu/tools/lotl/eu-lotl.xml
Rekisteröintitodiste listatulta myöntäjältä
myöntäjä on luotettujen listalla
✓ Vastaa kyselyä
Rekisteröintitodiste listaamattomalta myöntäjältä
myöntäjä ei ole luotettujen listalla
✗ Ei vastaa, ei tarjota haltijalle
{
"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"] }
]
}
]
}Esimerkkivastaus: vain listatun myöntäjän todiste
Mitä lompakko lähettää
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Tiedot, jotka todentaja näkee validoinnin jälkeen
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V."
}Haltijalla oli myös rekisteröintitodiste listaamattomalta myöntäjältä, mutta lompakko ei tarjonnut sitä. trusted_authorities on lompakon suodatin, ei takuu: todentaja tarkistaa silti itse myöntäjän luotettujen listaa vasten validoidessaan esityksen.
Arvon täsmäytys: claims.values
Tietokyselyssä voi olla values eli luettelo merkkijonoja, kokonaislukuja tai totuusarvoja. Lompakko palauttaa tiedon vain, jos sen tyyppi ja arvo vastaavat täsmälleen jotakin niistä, joten todentaja voi tarkistaa ehdon pyytämättä ensin mitään muuta.
Esimerkki: vain Alankomaihin tai Belgiaan rekisteröidyt yritykset
Todentaja sanoo: vain yritys, joka on rekisteröity johonkin näistä maista
Hollantilainen yritys
registration_country: "NL"
✓ Vastaa kyselyä
Saksalainen yritys
registration_country: "DE"
✗ Ei vastaa, ei tarjota haltijalle
{
"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"]
}
]
}
]
}Esimerkkivastaus: hollantilainen yritys
Mitä lompakko lähettää
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Tiedot, jotka todentaja näkee validoinnin jälkeen
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Saksalaisen yrityksen todisteessa registration_country on "DE", joten se ei täytä kyselyä eikä lompakolla ole siitä mitään palautettavaa. Todentajan kannattaa silti tarkistaa arvo validoiduista tiedoista eikä luottaa lompakon suodatukseen.
Muotokohtaiset rajoitteet meta-kentässä
SD-JWT VC: vct_values
dc+sd-jwt-muodossa meta.vct_values luettelee todistetyyppien tunnisteet, jotka todentaja hyväksyy. Kysely vastaa vain tallennettua todistetta, jonka vct on jokin luetelluista arvoista, joten todentaja, joka luottaa vain yhden myöntäjän rekisteröintitodistetyyppiin, luettelee juuri sen tunnisteen.
mso_mdoc: doctype_value ja nimiavaruus
mso_mdoc-muodossa meta.doctype_value kiinnittää ISO 18013-5 -standardin DocTypen, ja jokainen tietopolku alkaa pelkän kentän nimen sijaan sillä mdoc-nimiavaruudella, johon tieto kuuluu, koska mdoc ryhmittelee tiedot nimiavaruuksittain eikä litteään objektiin.
DCQL:n tilanne nyt
- DCQL on määritelty itse OpenID4VP-spesifikaatiossa eikä erillisessä dokumentissa, ja se on ollut osa luonnosta siitä lähtien, kun mekanismi otettiin käyttöön korvaamaan OpenID4VP-pyyntöjen aiempi riippuvuus DIF Presentation Exchangesta.
- EUDI Wallet Architecture and Reference Framework määrittää OpenID4VP:n esitysprotokollaksi ja sen myötä DCQL:n kyselymekanismiksi, jota ekosysteemin luottavien osapuolten ja lompakoiden odotetaan tukevan.
- EUDI Wallet Reference Implementation -ohjelman lompakko- ja todentajatoteutukset ovat vakiintuneet DCQL:ään, joten uusien OpenID4VP:hen perustuvien yrityslompakkointegraatioiden kannattaa nyt olettaa esityspyyntöjen kyselymuodoksi DCQL eikä Presentation Exchange.
Aiheeseen liittyvät termit
Usein kysytyt kysymykset
Miten DCQL eroaa DIF Presentation Exchangesta?
Molemmat kuvaavat, mitä todentaja haluaa lompakolta, mutta DCQL on rajattu OpenID4VP:hen ja määritelty suoraan kyseisessä spesifikaatiossa, kun taas Presentation Exchange on erillinen DIF-spesifikaatio, joka kattaa myös muita protokollia. DCQL on tarkoituksella suppeampi: siinä ei ole input descriptor -ryhmiä eikä submission requirements -vaatimuksia, ja se ilmaisee muotokohtaiset rajoitteet, kuten mdoc-doctypen tai SD-JWT VC -tyypin, suoraan kyselyobjektissa yleisen JSON Schema -suodattimen sijaan. EUDI Wallet -ekosysteemi on vakiinnuttanut DCQL:n OpenID4VP-esitysten standardiksi.
Voiko yksi DCQL-kysely pyytää useampaa kuin yhtä todistetta?
Kyllä. credentials-taulukossa voi olla useita todistekyselyjä, joilla kullakin on oma id. Lompakko, jossa on osuma jokaiselle kohdalle, palauttaa yhden esityksen kohtaa kohden. Valinnaisella credential_sets-objektilla voi lisäksi vaatia tiettyjä yhdistelmiä, esimerkiksi hyväksyä joko pelkän yritysrekisteröintitodisteen tai yritysrekisteröintitodisteen yhdessä UBO-ilmoituksen kanssa, ilman että haltijalta kysytään kahdesti.
Minkä ongelman claim_sets ratkaisee yksittäisen todistekyselyn sisällä?
Todisteessa ei aina ole jokaista tietoa, jonka todentaja haluaisi. claim_sets luettelee vaihtoehtoisia tieto-id-ryhmiä, joista kukin riittäisi yksinään täyttämään pyynnön, järjestettynä halutuimmasta vähiten haluttuun. Lompakko valitsee ensimmäisen ryhmän, jonka se voi täyttää kokonaan haltijan todellisilla tiedoilla. Näin todentaja voi pyytää tarkkaa henkilötunnusta, kun se on saatavilla, ja tyytyä muuten karkeampaan tarkistukseen, kuten yli 18 vuoden ikää osoittavaan tietoon, lähettämättä kahta erillistä pyyntöä.
Onko DCQL EUDI Walletin oma ratkaisu?
Ei. DCQL on osa OpenID4VP:n ydinspesifikaatiota, ja mikä tahansa OpenID4VP-toteutus voi käyttää sitä. EUDI Wallet -ekosysteemi on merkittävä käyttäjä: Architecture and Reference Framework määrittää OpenID4VP:n ja DCQL:n esitysmekanismiksi, jota luottavien osapuolten on tuettava. Siksi se on erityisen tärkeä Euroopan markkinoille rakennetuille lompakoille ja todentajille.
Toteuttaako DCQL itse valikoivan tietojen luovutuksen?
Ei. DCQL kuvaa vain sen, mitä pyydetään. Se, voiko lompakko paljastaa täsmälleen nuo tiedot eikä mitään muuta, riippuu todisteen muodosta: sekä SD-JWT VC että ISO mdoc tukevat osan tiedoista luovuttamista, joten DCQL:n claims-taulukko hyödyntää tätä tukea. DCQL toimisi myös muodossa, jossa valikoivaa luovutusta ei ole, mutta tällöin haltijan pitäisi luovuttaa koko todiste, vaikka kysely koskisi vain yhtä tietoa.
Lähteet
Tämä sivu on tarkoitettu tiedoksi eikä ole oikeudellista neuvontaa. Luotettavaa ohjeistusta saat suoraan OpenID Foundationilta ja Euroopan komissiolta.