Preskočiť na hlavný obsah

DCQL vysvetlené: ako overovateľ žiada od peňaženky presne to, čo potrebuje

Digital Credentials Query Language, DCQL, je formát dopytov v JSON, ktorý OpenID4VP používa v prezentačnej požiadavke. Spoliehajúca sa strana ním opíše, ktoré osvedčenia a ktoré údaje v nich chce vidieť, a to tak, aby to každá vyhovujúca peňaženka dokázala spracovať bez individuálnej integrácie.

Aký problém DCQL rieši

Firemná peňaženka môže obsahovať osvedčenia v rôznych formátoch: registráciu spoločnosti ako SD-JWT VC, odbornú kvalifikáciu zakódovanú ako mdoc, overiteľné osvedčenie W3C z predchádzajúceho pilotu. Overovateľ, ktorý potrebuje iba potvrdiť registračné číslo a obchodné meno, nemá prenosný spôsob, ako si naprieč formátmi vyžiadať presne to. Musí buď prijať celé osvedčenie, alebo ručne naprogramovať samostatnú požiadavku pre každý formát a každého dodávateľa peňaženky.

DCQL túto medzeru na strane požiadavky odstraňuje. Ide o jeden objekt JSON vložený do autorizačnej požiadavky OpenID4VP, ktorý uvádza jeden alebo viac dopytov na osvedčenia, každý viazaný na formát a sadu ciest k údajom. Peňaženka vyhodnotí dopyt voči uloženým osvedčeniam, zistí, ktoré zodpovedajú, a až potom požiada držiteľa o schválenie zdieľania týchto konkrétnych údajov. Overovateľ dostane predvídateľnú štruktúru bez ohľadu na to, akú peňaženku držiteľ použil.

1. Overovateľ

Odošle požiadavku OpenID4VP s dcql_query

2. Peňaženka

Porovná dopyt s uloženými osvedčeniami

3. Držiteľ

Schváli zdieľanie iba požadovaných údajov

4. Overovateľ

Dostane jednu prezentáciu na každé id dopytu na osvedčenie

Štruktúra dopytu DCQL

Dopyt DCQL je jeden objekt JSON s poľom credentials a voliteľne s poľom credential_sets. Každá položka v credentials je dopyt na osvedčenie. Polia označené M sú v danom dopyte povinné.

dcql_query

credentials[ ]

Jeden dopyt na každé potrebné osvedčenie

id + format

Ktoré osvedčenie a v akom formáte

meta

Filter typu, napríklad vct_values

claims[ ]

Cesty k údajom na zverejnenie

claim_sets[ ]

Prípustné kombinácie údajov

credential_sets[ ]

Voliteľné: ktoré kombinácie dopytov na osvedčenia spĺňajú požiadavku

PoleTypPovinné
idstringM
formatenum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vcM
metaobjekt, štruktúra závisí od formátu
claimspole dopytov na údaje
claim_setspole polí id údajov
trusted_authoritiespole objektov s typom a hodnotami

Každá položka v claims je sama osebe objekt: id, ktorým sa na ňu odkazuje z claim_sets, path, pole určujúce umiestnenie údaja v osvedčení (napríklad ["legal_name"] pre údaj SD-JWT na najvyššej úrovni alebo ["org", "registration_number"] pre vnorený údaj), a voliteľne values, zoznam hodnôt, ktorým musí údaj zodpovedať.

Príklad: kontrola registrácie spoločnosti

Registrácia spoločnosti

dc+sd-jwt

Overovateľ hovorí: toto chcem dostať

  • ✓ Registračné čísloreg_nopath: ["registration_number"]
  • ✓ Obchodné menolegal_namepath: ["legal_name"]
  • ✓ Krajina registráciereg_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"] }
      ]
    }
  ]
}

Príklad odpovede peňaženky

Peňaženka odpovie objektom vp_token, ktorého kľúčmi sú id dopytov na osvedčenia. Každá hodnota je pole prezentácií. Pri dc+sd-jwt tvorí prezentáciu JWT podpísaný vydavateľom, jeden disclosure na každý zdieľaný údaj a key binding JWT, ktorý ju viaže na nonce a klienta tejto požiadavky.

Čo peňaženka odošle

{
  "vp_token": {
    "company_registration": [
      "<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
    ]
  }
}

Údaje, ktoré overovateľ vidí po validácii

{
  "vct": "urn:eudi:business:company-registration:1",
  "registration_number": "12345678",
  "legal_name": "Example Logistics B.V.",
  "registration_country": "NL"
}

Náhradné riešenie: claim_sets

claim_sets uvádza skupiny id údajov v poradí preferencie. Peňaženka vráti prvú skupinu, ktorú dokáže úplne splniť z toho, čo držiteľ skutočne má, takže overovateľ nemusí posielať dve samostatné požiadavky pre presný a náhradný prípad.

Príklad: registračné číslo, alebo náhradne iba obchodné meno

1. Preferované

reg_nolegal_name

Vráti sa, keď osvedčenie obsahuje oba údaje

2. Náhradné

legal_name

Vráti sa, iba ak prvú sadu nemožno splniť

{
  "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"]
      ]
    }
  ]
}

Overovateľ tu uprednostňuje registračné číslo spolu s obchodným menom, ale prijme aj samotné obchodné meno, ak osvedčenie držiteľa údaj o registračnom čísle neobsahuje.

Príklad odpovede: použila sa náhradná sada

Čo peňaženka odošle

{
  "vp_token": {
    "company_registration": [
      "<issuer-signed JWT>~<disclosure: legal_name>~<key binding JWT>"
    ]
  }
}

Údaje, ktoré overovateľ vidí po validácii

{
  "vct": "urn:eudi:business:company-registration:1",
  "legal_name": "Example Logistics B.V."
}

Osvedčenie držiteľa nemá registračné číslo, preto peňaženka splnila druhú sadu údajov a zdieľala jediný disclosure. Odpoveď neuvádza, ktorá sada sa použila: overovateľ to vyčíta z údajov, ktoré dostane.

Kombinovanie osvedčení: credential_sets

credential_sets funguje o úroveň vyššie ako claim_sets. Každá položka uvádza options, pričom každá možnosť je skupina id dopytov na osvedčenia. Peňaženka musí splniť jednu možnosť z každej povinnej položky, čím overovateľ získa logiku AND a OR naprieč osvedčeniami v jedinej požiadavke.

Povinné

Registrácia spoločnosti

AND

Jedno z

Registrácia pre DPH

OR

Jedno z

Potvrdenie bankového účtu

"credential_sets": [
  { "options": [["company_registration"]] },
  { "options": [["vat_registration"], ["bank_account"]] }
]

Príklad odpovede: registrácia a bankový účet

Čo peňaženka odošle

{
  "vp_token": {
    "company_registration": [
      "<issuer-signed JWT>~<disclosures>~<key binding JWT>"
    ],
    "bank_account": [
      "<issuer-signed JWT>~<disclosures>~<key binding JWT>"
    ]
  }
}

Údaje, ktoré overovateľ vidí po validácii

{
  "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žiteľ nemá osvedčenie o registrácii pre DPH, preto peňaženka zvolila druhú možnosť druhej sady. Nepoužité id dopytov, tu vat_registration, vo vp_token jednoducho chýbajú.

Iba dôveryhodní vydavatelia: trusted_authorities

trusted_authorities zužuje dopyt na osvedčenia, ktorých vydavateľa podporuje autorita, ktorej overovateľ dôveruje. Každá položka má typ a zoznam hodnôt: aki pre identifikátor kľúča autority, etsi_tl pre dôveryhodný zoznam ETSI alebo openid_federation pre kotvu dôvery federácie. Peňaženka ponúkne iba zodpovedajúce osvedčenia.

Príklad: registrácia od vydavateľa zo zoznamu

Overovateľ hovorí: iba od vydavateľov z tohto dôveryhodného zoznamu

type: etsi_tl

https://ec.europa.eu/tools/lotl/eu-lotl.xml

Registračné osvedčenie od vydavateľa zo zoznamu

vydavateľ je na dôveryhodnom zozname

✓ Zodpovedá dopytu

Registračné osvedčenie od vydavateľa mimo zoznamu

vydavateľ nie je na dôveryhodnom zozname

✗ Nezodpovedá, držiteľovi sa neponúkne

{
  "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"] }
      ]
    }
  ]
}

Príklad odpovede: iba osvedčenie vydavateľa zo zoznamu

Čo peňaženka odošle

{
  "vp_token": {
    "company_registration": [
      "<issuer-signed JWT>~<disclosure: registration_number>~<disclosure: legal_name>~<key binding JWT>"
    ]
  }
}

Údaje, ktoré overovateľ vidí po validácii

{
  "vct": "urn:eudi:business:company-registration:1",
  "registration_number": "12345678",
  "legal_name": "Example Logistics B.V."
}

Držiteľ mal aj registračné osvedčenie od vydavateľa mimo zoznamu, no peňaženka ho neponúkla. trusted_authorities je filter pre peňaženku, nie záruka: overovateľ pri validácii prezentácie aj tak sám skontroluje vydavateľa voči dôveryhodnému zoznamu.

Zhoda hodnoty: claims.values

Dopyt na údaj môže obsahovať values, zoznam reťazcov, celých čísel alebo logických hodnôt. Peňaženka vráti údaj iba vtedy, keď jeho typ a hodnota presne zodpovedajú jednej z nich, takže overovateľ môže overiť podmienku bez toho, aby najprv žiadal čokoľvek iné.

Príklad: iba spoločnosti registrované v Holandsku alebo Belgicku

Overovateľ hovorí: iba spoločnosť registrovaná v jednej z týchto krajín

reg_countryvalues:"NL""BE"

Holandská spoločnosť

registration_country: "NL"

✓ Zodpovedá dopytu

Nemecká spoločnosť

registration_country: "DE"

✗ Nezodpovedá, držiteľovi sa neponúkne

{
  "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"]
        }
      ]
    }
  ]
}

Príklad odpovede: holandská spoločnosť

Čo peňaženka odošle

{
  "vp_token": {
    "company_registration": [
      "<issuer-signed JWT>~<disclosure: legal_name>~<disclosure: registration_country>~<key binding JWT>"
    ]
  }
}

Údaje, ktoré overovateľ vidí po validácii

{
  "vct": "urn:eudi:business:company-registration:1",
  "legal_name": "Example Logistics B.V.",
  "registration_country": "NL"
}

Osvedčenie nemeckej spoločnosti má registration_country "DE", preto dopyt nespĺňa a peňaženka zaň nemá čo vrátiť. Overovateľ by mal hodnotu aj tak skontrolovať vo validovaných údajoch a nespoliehať sa na filtrovanie v peňaženke.

Obmedzenia špecifické pre formát v meta

SD-JWT VC: vct_values

Pri dc+sd-jwt uvádza meta.vct_values identifikátory typov osvedčení, ktoré overovateľ prijme. Dopyt zodpovedá iba uloženému osvedčeniu, ktorého vct je jednou z uvedených hodnôt, takže overovateľ, ktorý dôveruje iba typu registračného osvedčenia jedného vydavateľa, uvedie presne tento identifikátor.

mso_mdoc: doctype_value a menný priestor

Pri mso_mdoc určuje meta.doctype_value ISO 18013-5 DocType a každá cesta k údaju začína menným priestorom mdoc, do ktorého údaj patrí, a nie jednoduchým názvom poľa, pretože mdoc zoskupuje údaje podľa menných priestorov namiesto plochého objektu.

Kde je DCQL dnes

  • DCQL je definovaný priamo v špecifikácii OpenID4VP, nie v samostatnom dokumente, a je súčasťou návrhu odvtedy, čo bol mechanizmus zavedený ako náhrada skoršej závislosti požiadaviek OpenID4VP od DIF Presentation Exchange.
  • EUDI Wallet Architecture and Reference Framework určuje OpenID4VP ako prezentačný protokol a s ním DCQL ako dopytovací mechanizmus, ktorý majú spoliehajúce sa strany a peňaženky v ekosystéme podporovať.
  • Referenčné implementácie peňaženiek a overovateľov v programe EUDI Wallet Reference Implementation sa zjednotili na DCQL, preto by nové integrácie firemných peňaženiek postavené dnes na OpenID4VP mali ako formát dopytov pre prezentačné požiadavky počítať s DCQL, nie s Presentation Exchange.

Súvisiace pojmy

Často kladené otázky

Čím sa DCQL líši od DIF Presentation Exchange?

Obe opisujú, čo overovateľ od peňaženky chce, ale DCQL je určený pre OpenID4VP a definovaný priamo v tejto špecifikácii, zatiaľ čo Presentation Exchange je samostatná špecifikácia DIF, ktorá pokrýva aj iné protokoly. DCQL je zámerne menší: nemá skupiny input descriptorov ani submission requirements a obmedzenia špecifické pre formát, napríklad mdoc doctype alebo typ SD-JWT VC, vyjadruje priamo v objekte dopytu, nie cez všeobecný filter JSON Schema. Ekosystém EUDI Wallet štandardizoval DCQL pre prezentácie cez OpenID4VP.

Môže jeden dopyt DCQL žiadať viac ako jedno osvedčenie?

Áno. Pole credentials môže obsahovať niekoľko dopytov na osvedčenia, každý s vlastným id. Peňaženka, ktorá má zhodu pre každú položku, vráti jednu prezentáciu na položku. Voliteľný objekt credential_sets môže navyše vyžadovať konkrétne kombinácie, napríklad prijať buď samotné osvedčenie o registrácii spoločnosti, alebo osvedčenie o registrácii spoločnosti spolu s vyhlásením o UBO, bez toho, aby sa držiteľa pýtal dvakrát.

Aký problém riešia claim_sets v rámci jedného dopytu na osvedčenie?

Osvedčenie nie vždy obsahuje všetky údaje, ktoré by overovateľ chcel. claim_sets uvádza alternatívne skupiny id údajov, z ktorých by každá sama osebe požiadavku splnila, zoradené od najviac po najmenej preferovanú. Peňaženka vyberie prvú skupinu, ktorú dokáže úplne splniť z údajov, ktoré držiteľ skutočne má. Overovateľ tak môže žiadať presné identifikačné číslo, ak je k dispozícii, a inak sa uspokojiť s hrubšou kontrolou, napríklad príznakom „nad 18 rokov“, bez odosielania dvoch samostatných požiadaviek.

Je DCQL určený len pre EUDI Wallet?

Nie. DCQL je súčasťou základnej špecifikácie OpenID4VP a môže ho použiť akákoľvek implementácia OpenID4VP. Ekosystém EUDI Wallet patrí k jeho významným používateľom: Architecture and Reference Framework určuje OpenID4VP s DCQL ako prezentačný mechanizmus, ktorý musia spoliehajúce sa strany podporovať. Preto je dôležitý najmä pre peňaženky a overovateľov vyvíjaných pre európsky trh.

Vykonáva DCQL sám selektívne zverejnenie?

Nie. DCQL iba opisuje, čo sa žiada. Či peňaženka dokáže zverejniť presne tieto údaje a nič iné, závisí od formátu osvedčenia: SD-JWT VC aj ISO mdoc podporujú zverejnenie podmnožiny svojich údajov, takže pole claims v DCQL na túto podporu nadväzuje. DCQL by fungoval aj pri formáte bez selektívneho zverejnenia, no držiteľ by musel na splnenie aj dopytu na jediný údaj zdieľať celé osvedčenie.

Zdroje

  1. OpenID for Verifiable Presentations 1.0, časť Digital Credentials Query Language (DCQL)
  2. EUDI Wallet Architecture and Reference Framework
  3. Špecifikácia DIF Presentation Exchange 2.0.0

Táto stránka má informatívny charakter a nepredstavuje právne poradenstvo. Záväzné informácie získate priamo od OpenID Foundation a Európskej komisie.

Porozprávajte sa s nami o integrácii EUDI Wallet