DCQL paaiškinimas: kaip tikrintojas prašo piniginės tiksliai to, ko reikia
Digital Credentials Query Language, DCQL, yra JSON užklausų formatas, kurį OpenID4VP naudoja pateikimo užklausoje. Juo pasikliaujančioji šalis aprašo, kokius kredencialus ir kokius juose esančius duomenis nori matyti, taip, kad bet kuri reikalavimus atitinkanti piniginė galėtų tai perskaityti be individualios integracijos.
Kokią problemą sprendžia DCQL
Verslo piniginėje gali būti įvairių formatų kredencialų: SD-JWT VC įmonės registracija, mdoc formatu užkoduota profesinė kvalifikacija, W3C patikrinamasis kredencialas iš ankstesnio bandomojo projekto. Tikrintojas, kuriam tereikia patvirtinti registracijos numerį ir teisinį pavadinimą, neturi universalaus būdo paprašyti būtent to visuose formatuose: tenka arba priimti visą kredencialą, arba rankiniu būdu programuoti atskirą užklausą kiekvienam formatui ir kiekvienam piniginės tiekėjui.
DCQL užpildo šią spragą užklausos pusėje. Tai vienas JSON objektas, įterptas į OpenID4VP autorizacijos užklausą, kuriame nurodoma viena ar daugiau kredencialų užklausų, kiekviena susieta su formatu ir duomenų kelių rinkiniu. Piniginė įvertina užklausą pagal saugomus kredencialus, nustato, kurie atitinka, ir tik tada prašo turėtojo leisti atskleisti būtent tuos duomenis. Tikrintojas gauna nuspėjamą struktūrą, nepriklausomai nuo to, kokią piniginę naudojo turėtojas.
1. Tikrintojas
Siunčia OpenID4VP užklausą su dcql_query
2. Piniginė
Sulygina užklausą su saugomais kredencialais
3. Turėtojas
Leidžia atskleisti tik prašomus duomenis
4. Tikrintojas
Gauna po vieną pateiktį kiekvienam kredencialo užklausos id
DCQL užklausos sandara
DCQL užklausa yra vienas JSON objektas su masyvu credentials ir, pasirinktinai, masyvu credential_sets. Kiekvienas credentials įrašas yra kredencialo užklausa. Laukai, pažymėti M, toje užklausoje privalomi.
dcql_query
credentials[ ]
Po vieną kredencialo užklausą kiekvienam reikalingam kredencialui
id + format
Koks kredencialas ir kokiu formatu
meta
Tipo filtras, pavyzdžiui, vct_values
claims[ ]
Atskleidžiamų duomenų keliai
claim_sets[ ]
Priimtini duomenų deriniai
credential_sets[ ]
Neprivaloma: kokie kredencialų užklausų deriniai tenkina užklausą
| Laukas | Tipas | Privalomas |
|---|---|---|
| id | string | M |
| format | enum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vc | M |
| meta | objektas, struktūra priklauso nuo formato | |
| claims | duomenų užklausų masyvas | |
| claim_sets | duomenų id masyvų masyvas | |
| trusted_authorities | objektų su tipu ir reikšmėmis masyvas |
Kiekvienas claims įrašas pats yra objektas: id, kuriuo į jį nurodoma iš claim_sets, path, masyvas, nurodantis duomens vietą kredenciale (pavyzdžiui, ["legal_name"] aukščiausio lygio SD-JWT duomeniui arba ["org", "registration_number"] įdėtiniam), ir pasirinktinai values, reikšmių sąrašas, kurį duomuo turi atitikti.
Pavyzdys: įmonės registracijos patikrinimas
Įmonės registracija
dc+sd-jwtTikrintojas sako: štai ką noriu gauti
- ✓ Registracijos numerisreg_nopath: ["registration_number"]
- ✓ Teisinis pavadinimaslegal_namepath: ["legal_name"]
- ✓ Registracijos šalisreg_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"] }
]
}
]
}Piniginės atsakymo pavyzdys
Piniginė atsako objektu vp_token, kurio raktai yra kredencialų užklausų id. Kiekviena reikšmė yra pateikčių masyvas. Formato dc+sd-jwt pateiktį sudaro išdavėjo pasirašytas JWT, po vieną disclosure kiekvienam atskleistam duomeniui ir key binding JWT, susiejantis ją su šios užklausos nonce ir klientu.
Ką siunčia piniginė
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Duomenys, kuriuos tikrintojas mato po patvirtinimo
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Atsarginis variantas: claim_sets
claim_sets išvardija duomenų id grupes pagal pageidavimo eilę. Piniginė grąžina pirmąją grupę, kurią gali visiškai patenkinti iš to, ką turėtojas iš tikrųjų turi, todėl tikrintojui nereikia siųsti dviejų atskirų užklausų tiksliam ir atsarginiam atvejui.
Pavyzdys: registracijos numeris arba atsarginis variantas tik su teisiniu pavadinimu
1. Pageidaujama
Grąžinama, kai kredenciale yra abu duomenys
2. Atsarginis
Grąžinama tik tada, kai pirmojo rinkinio patenkinti neįmanoma
{
"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"]
]
}
]
}Čia tikrintojas pageidauja registracijos numerio ir teisinio pavadinimo, bet priims ir vien teisinį pavadinimą, jei turėtojo kredenciale nėra registracijos numerio duomens.
Atsakymo pavyzdys: panaudotas atsarginis variantas
Ką siunčia piniginė
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Duomenys, kuriuos tikrintojas mato po patvirtinimo
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V."
}Turėtojo kredenciale nėra registracijos numerio, todėl piniginė patenkino antrąjį duomenų rinkinį ir atskleidė vieną disclosure. Atsakyme nenurodoma, kuris rinkinys panaudotas: tikrintojas tai supranta iš gautų duomenų.
Kredencialų derinimas: credential_sets
credential_sets veikia vienu lygiu aukščiau nei claim_sets. Kiekviename įraše nurodomi options, kur kiekvienas variantas yra kredencialų užklausų id grupė. Piniginė turi patenkinti po vieną kiekvieno privalomo įrašo variantą, todėl tikrintojas vienoje užklausoje gali taikyti IR bei ARBA logiką keliems kredencialams.
Privaloma
Įmonės registracija
Vienas iš
PVM registracija
Vienas iš
Banko sąskaitos patvirtinimas
"credential_sets": [
{ "options": [["company_registration"]] },
{ "options": [["vat_registration"], ["bank_account"]] }
]Atsakymo pavyzdys: registracija ir banko sąskaita
Ką siunčia piniginė
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
],
"bank_account": [
"<issuer-signed JWT>~<disclosures>~<key binding JWT>"
]
}
}Duomenys, kuriuos tikrintojas mato po patvirtinimo
{
"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."
}
}Turėtojas neturi PVM registracijos kredencialo, todėl piniginė pasirinko antrojo rinkinio antrąjį variantą. Nepanaudotų užklausų id, šiuo atveju vat_registration, vp_token tiesiog nėra.
Tik patikimi išdavėjai: trusted_authorities
trusted_authorities susiaurina kredencialo užklausą iki kredencialų, kurių išdavėją patvirtina tikrintojo pasitikima institucija. Kiekvienas įrašas turi tipą ir reikšmių sąrašą: aki institucijos rakto identifikatoriui, etsi_tl ETSI patikimų sąrašui arba openid_federation federacijos pasitikėjimo inkarui. Piniginė siūlo tik atitinkančius kredencialus.
Pavyzdys: registracija iš sąraše esančio išdavėjo
Tikrintojas sako: tik iš šiame patikimų sąraše esančių išdavėjų
https://ec.europa.eu/tools/lotl/eu-lotl.xml
Registracijos kredencialas iš sąraše esančio išdavėjo
išdavėjas yra patikimų sąraše
✓ Atitinka užklausą
Registracijos kredencialas iš sąraše nesančio išdavėjo
išdavėjo nėra patikimų sąraše
✗ Neatitinka, turėtojui nesiūloma
{
"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"] }
]
}
]
}Atsakymo pavyzdys: tik sąraše esančio išdavėjo kredencialas
Ką siunčia piniginė
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<key binding JWT>"
]
}
}Duomenys, kuriuos tikrintojas mato po patvirtinimo
{
"vct": "urn:eudi:business:company-registration:1",
"registration_number": "12345678",
"legal_name": "Example Logistics B.V."
}Turėtojas turėjo ir registracijos kredencialą iš sąraše nesančio išdavėjo, tačiau piniginė jo nepasiūlė. trusted_authorities yra filtras piniginei, o ne garantija: tikrindamas pateiktį, tikrintojas pats vis tiek patikrina išdavėją pagal patikimų sąrašą.
Reikšmės atitikimas: claims.values
Duomenų užklausoje gali būti values, eilučių, sveikųjų skaičių arba loginių reikšmių sąrašas. Piniginė grąžina duomenį tik tada, kai jo tipas ir reikšmė tiksliai atitinka vieną iš jų, todėl tikrintojas gali patikrinti sąlygą, prieš tai neprašydamas nieko kito.
Pavyzdys: tik Nyderlanduose arba Belgijoje registruotos įmonės
Tikrintojas sako: tik įmonė, registruota vienoje iš šių šalių
Nyderlandų įmonė
registration_country: "NL"
✓ Atitinka užklausą
Vokietijos įmonė
registration_country: "DE"
✗ Neatitinka, turėtojui nesiūloma
{
"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"]
}
]
}
]
}Atsakymo pavyzdys: Nyderlandų įmonė
Ką siunčia piniginė
{
"vp_token": {
"company_registration": [
"<issuer-signed JWT>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
]
}
}Duomenys, kuriuos tikrintojas mato po patvirtinimo
{
"vct": "urn:eudi:business:company-registration:1",
"legal_name": "Example Logistics B.V.",
"registration_country": "NL"
}Vokietijos įmonės kredenciale registration_country yra "DE", todėl jis netenkina užklausos ir piniginė neturi ką grąžinti. Tikrintojas vis tiek turėtų patikrinti reikšmę patvirtintuose duomenyse, o ne pasikliauti piniginės filtravimu.
Formatui būdingi apribojimai lauke meta
SD-JWT VC: vct_values
Formatui dc+sd-jwt meta.vct_values išvardija kredencialų tipų identifikatorius, kuriuos tikrintojas priims. Užklausa atitinka tik tą saugomą kredencialą, kurio vct yra viena iš nurodytų reikšmių, todėl tikrintojas, pasitikintis tik vieno išdavėjo registracijos kredencialo tipu, nurodo būtent tą identifikatorių.
mso_mdoc: doctype_value ir vardų sritis
Formatui mso_mdoc meta.doctype_value nustato ISO 18013-5 DocType, o kiekvienas duomens kelias prasideda mdoc vardų sritimi, kuriai duomuo priklauso, o ne paprastu lauko pavadinimu, nes mdoc grupuoja duomenis pagal vardų sritis, o ne plokščiame objekte.
DCQL padėtis šiandien
- DCQL apibrėžta pačioje OpenID4VP specifikacijoje, o ne atskirame dokumente, ir yra projekto dalis nuo tada, kai šis mechanizmas buvo įvestas pakeisti ankstesnę OpenID4VP užklausų priklausomybę nuo DIF Presentation Exchange.
- EUDI Wallet Architecture and Reference Framework nurodo OpenID4VP kaip pateikimo protokolą, o kartu ir DCQL kaip užklausų mechanizmą, kurį turėtų palaikyti ekosistemos pasikliaujančiosios šalys ir piniginės.
- Piniginių ir tikrintojų etaloniniai diegimai EUDI Wallet Reference Implementation programoje susivienijo ties DCQL, todėl naujos verslo piniginių integracijos, šiandien kuriamos pagal OpenID4VP, turėtų pateikimo užklausoms numatyti DCQL, o ne Presentation Exchange.
Susiję terminai
Dažnai užduodami klausimai
Kuo DCQL skiriasi nuo DIF Presentation Exchange?
Abu aprašo, ko tikrintojas nori iš piniginės, tačiau DCQL skirta OpenID4VP ir apibrėžta tiesiogiai toje specifikacijoje, o Presentation Exchange yra atskira DIF specifikacija, apimanti ir kitus protokolus. DCQL sąmoningai paprastesnė: joje nėra įvesties aprašų grupių ar pateikimo reikalavimų, o formatui būdingi apribojimai, pavyzdžiui, mdoc doctype arba SD-JWT VC tipas, nurodomi tiesiogiai užklausos objekte, o ne per bendrą JSON Schema filtrą. EUDI Wallet ekosistema OpenID4VP pateiktims standartizavo DCQL.
Ar viena DCQL užklausa gali prašyti daugiau nei vieno kredencialo?
Taip. Masyve credentials galima nurodyti kelias kredencialų užklausas, kiekvieną su savo id. Piniginė, turinti atitikmenis visiems įrašams, grąžina po vieną pateiktį kiekvienam įrašui. Papildomas neprivalomas objektas credential_sets gali reikalauti konkrečių derinių, pavyzdžiui, priimti arba vien įmonės registracijos kredencialą, arba įmonės registracijos kredencialą kartu su UBO deklaracija, neprašant turėtojo du kartus.
Kokią problemą claim_sets sprendžia vienoje kredencialo užklausoje?
Kredenciale ne visada yra visi duomenys, kurių norėtų tikrintojas. claim_sets išvardija alternatyvias duomenų id grupes, kurių kiekviena atskirai tenkintų užklausą, surikiuotas nuo labiausiai iki mažiausiai pageidaujamos. Piniginė pasirenka pirmąją grupę, kurią gali visiškai patenkinti iš turėtojo iš tikrųjų turimų duomenų. Taip tikrintojas gali prašyti tikslaus asmens kodo, kai jis yra, o kitu atveju tenkintis apytikslesniu patikrinimu, pavyzdžiui, požymiu „vyresnis nei 18 metų“, nesiųsdamas dviejų atskirų užklausų.
Ar DCQL skirta tik EUDI Wallet?
Ne. DCQL yra pagrindinės OpenID4VP specifikacijos dalis, ir ją gali naudoti bet kuris OpenID4VP diegimas. EUDI Wallet ekosistema yra ryškus jos taikytojas: Architecture and Reference Framework nurodo OpenID4VP su DCQL kaip pateikimo mechanizmą, kurį privalo palaikyti pasikliaujančiosios šalys. Todėl ji ypač svarbi Europos rinkai kuriamoms piniginėms ir tikrintojams.
Ar pati DCQL atlieka atrankinį atskleidimą?
Ne. DCQL tik aprašo, ko prašoma. Ar piniginė gali atskleisti būtent tuos duomenis ir nieko daugiau, priklauso nuo kredencialo formato: ir SD-JWT VC, ir ISO mdoc leidžia atskleisti dalį savo duomenų, todėl DCQL masyvas claims atitinka šią galimybę. DCQL veiktų ir su formatu be atrankinio atskleidimo, tačiau turėtojui tektų atskleisti visą kredencialą net ir užklausai, prašančiai vieno duomens.
Šaltiniai
Šis puslapis yra informacinio pobūdžio ir nėra teisinė konsultacija. Autoritetingų nurodymų kreipkitės tiesiogiai į OpenID Foundation ir Europos Komisiją.