Přejít na hlavní obsah

DCQL vysvětleno: jak si ověřovatel vyžádá od peněženky přesně to, co potřebuje

Digital Credentials Query Language, DCQL, je formát dotazů v JSON, který OpenID4VP používá v požadavku na prezentaci. Umožňuje spoléhající se straně popsat, která osvědčení a které údaje v nich chce vidět, a to tak, že jej dokáže zpracovat každá kompatibilní peněženka bez zakázkové integrace.

Problém, který DCQL řeší

Firemní peněženka může obsahovat osvědčení v několika formátech: registraci společnosti jako SD-JWT VC, odbornou kvalifikaci kódovanou jako mdoc nebo ověřitelné osvědčení W3C z dřívějšího pilotu. Ověřovatel, který potřebuje potvrdit pouze identifikační číslo a obchodní firmu, nemá přenositelný způsob, jak si napříč formáty vyžádat právě to. Musí buď přijmout celé osvědčení, nebo ručně naprogramovat samostatný požadavek pro každý formát a každého dodavatele peněženky.

DCQL tuto mezeru řeší na straně požadavku. Jde o jediný objekt JSON vložený do autorizačního požadavku OpenID4VP, který uvádí jeden nebo více dotazů na osvědčení, každý vázaný na formát a sadu cest k údajům. Peněženka vyhodnotí dotaz vůči uloženým osvědčením, zjistí, která odpovídají, a teprve poté požádá držitele o schválení zpřístupnění právě těchto údajů. Ověřovatel dostane předvídatelnou strukturu bez ohledu na to, jakou peněženku držitel použil.

1. Ověřovatel

Odešle požadavek OpenID4VP s dcql_query

2. Peněženka

Porovná dotaz s uloženými osvědčeními

3. Držitel

Schválí zpřístupnění pouze požadovaných údajů

4. Ověřovatel

Obdrží jednu prezentaci pro každé id dotazu na osvědčení

Struktura dotazu DCQL

Dotaz DCQL je jeden objekt JSON s polem credentials a volitelně s polem credential_sets. Každá položka v credentials je dotaz na osvědčení. Pole označená M jsou v daném dotazu povinná.

dcql_query

credentials[ ]

Jeden dotaz na každé potřebné osvědčení

id + format

Jaké osvědčení a v jakém formátu

meta

Filtr typu, například vct_values

claims[ ]

Cesty k údajům, které se mají zpřístupnit

claim_sets[ ]

Přípustné kombinace údajů

credential_sets[ ]

Volitelné: které kombinace dotazů na osvědčení požadavek splňují

PoleTypPovinné
idstringM
formatenum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vcM
metaobjekt, tvar závisí na formátu
claimspole dotazů na údaje
claim_setspole polí id údajů
trusted_authoritiespole objektů s type a values

Každá položka v claims je sama objektem: id, kterým se na ni odkazuje z claim_sets, path, pole určující umístění údaje v osvědčení (například ["legal_name"] pro údaj SD-JWT na nejvyšší úrovni nebo ["org", "registration_number"] pro vnořený údaj), a volitelně values, seznam hodnot, kterým musí údaj odpovídat.

Praktický příklad: ověření registrace společnosti

Registrace společnosti

dc+sd-jwt

Ověřovatel říká: tohle chci dostat

  • ✓ Identifikační čísloreg_nopath: ["registration_number"]
  • ✓ Obchodní firmalegal_namepath: ["legal_name"]
  • ✓ Země registracereg_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"] }
      ]
    }
  ]
}

Příklad odpovědi peněženky

Peněženka odpoví objektem vp_token, jehož klíči jsou id dotazů na osvědčení. Každá hodnota je pole prezentací. U dc+sd-jwt se prezentace skládá z JWT podepsaného vydavatelem, jednoho disclosure pro každý zpřístupněný údaj a key binding JWT, který ji váže k nonce a klientovi tohoto požadavku.

Co peněženka odešle

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

Údaje, které ověřovatel vidí po validaci

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

Záložní varianta: claim_sets

claim_sets uvádí skupiny id údajů v pořadí preference. Peněženka vrátí první skupinu, kterou dokáže plně splnit z toho, co držitel skutečně má, takže ověřovatel nemusí posílat dva samostatné požadavky pro přesný a záložní případ.

Praktický příklad: identifikační číslo, nebo záložně jen obchodní firma

1. Preferováno

reg_nolegal_name

Vrátí se, pokud osvědčení obsahuje oba údaje

2. Záložní

legal_name

Vrátí se, jen pokud nelze splnit první sadu

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

Ověřovatel zde preferuje identifikační číslo spolu s obchodní firmou, ale přijme i samotnou obchodní firmu, pokud osvědčení držitele údaj o identifikačním čísle neobsahuje.

Příklad odpovědi: použila se záložní varianta

Co peněženka odešle

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

Údaje, které ověřovatel vidí po validaci

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

Osvědčení držitele neobsahuje identifikační číslo, proto peněženka splnila druhou sadu údajů a zpřístupnila jediný disclosure. Odpověď neuvádí, která sada byla použita: ověřovatel to pozná z údajů, které obdrží.

Kombinace osvědčení: credential_sets

credential_sets funguje o úroveň výše než claim_sets. Každá položka uvádí options, přičemž každá možnost je skupina id dotazů na osvědčení. Peněženka musí splnit jednu možnost z každé povinné položky, což ověřovateli dává logiku AND a OR napříč osvědčeními v jediném požadavku.

Povinné

Registrace společnosti

AND

Jedno z

Registrace k DPH

OR

Jedno z

Potvrzení bankovního účtu

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

Příklad odpovědi: registrace a bankovní účet

Co peněženka odešle

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

Údaje, které ověřovatel vidí po validaci

{
  "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žitel nemá osvědčení o registraci k DPH, proto peněženka zvolila druhou možnost druhé sady. Id dotazů, které nebyly použity, zde vat_registration, ve vp_token jednoduše chybí.

Pouze důvěryhodní vydavatelé: trusted_authorities

trusted_authorities omezuje dotaz na osvědčení, jejichž vydavatele podporuje autorita, které ověřovatel důvěřuje. Každá položka má type a seznam values: aki pro identifikátor klíče autority, etsi_tl pro důvěryhodný seznam ETSI nebo openid_federation pro kotvu důvěry federace. Peněženka nabízí pouze odpovídající osvědčení.

Praktický příklad: registrace od uvedeného vydavatele

Ověřovatel říká: pouze od vydavatelů z tohoto seznamu důvěryhodných

type: etsi_tl

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

Osvědčení o registraci od uvedeného vydavatele

vydavatel je na seznamu důvěryhodných

✓ Odpovídá dotazu

Osvědčení o registraci od neuvedeného vydavatele

vydavatel není na seznamu důvěryhodných

✗ Neodpovídá, držiteli se nenabídne

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

Příklad odpovědi: pouze osvědčení uvedeného vydavatele

Co peněženka odešle

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

Údaje, které ověřovatel vidí po validaci

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

Držitel měl také osvědčení o registraci od neuvedeného vydavatele, ale peněženka ho nenabídla. trusted_authorities je filtr pro peněženku, nikoli záruka: ověřovatel při validaci prezentace stále sám kontroluje vydavatele vůči důvěryhodnému seznamu.

Shoda hodnoty: claims.values

Dotaz na údaj může obsahovat values, seznam řetězců, celých čísel nebo logických hodnot. Peněženka vrátí údaj pouze tehdy, když jeho typ a hodnota přesně odpovídají jedné z nich, takže ověřovatel může ověřit podmínku, aniž by nejprve žádal o cokoli dalšího.

Praktický příklad: pouze společnosti registrované v Nizozemsku nebo Belgii

Ověřovatel říká: pouze společnost registrovaná v jedné z těchto zemí

reg_countryvalues:"NL""BE"

Nizozemská společnost

registration_country: "NL"

✓ Odpovídá dotazu

Německá společnost

registration_country: "DE"

✗ Neodpovídá, držiteli se nenabídne

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

Příklad odpovědi: nizozemská společnost

Co peněženka odešle

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

Údaje, které ověřovatel vidí po validaci

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

Osvědčení německé společnosti má registration_country "DE", takže dotaz nesplňuje a peněženka pro něj nemá co vrátit. Ověřovatel by měl hodnotu přesto zkontrolovat ve validovaných údajích a nespoléhat na filtrování v peněžence.

Omezení specifická pro formát v meta

SD-JWT VC: vct_values

U dc+sd-jwt uvádí meta.vct_values identifikátory typů osvědčení, které ověřovatel přijme. Dotaz odpovídá pouze uloženému osvědčení, jehož vct je jednou z uvedených hodnot. Ověřovatel, který důvěřuje jen typu osvědčení o registraci od jednoho vydavatele, uvede přesně tento identifikátor.

mso_mdoc: doctype_value a jmenný prostor

U mso_mdoc určuje meta.doctype_value DocType podle ISO 18013-5 a každá cesta k údaji začíná jmenným prostorem mdoc, do kterého údaj patří, nikoli prostým názvem pole, protože mdoc seskupuje údaje podle jmenných prostorů místo plochého objektu.

Kde DCQL stojí dnes

  • DCQL je definován přímo ve specifikaci OpenID4VP, nikoli jako samostatný dokument, a je součástí návrhu od chvíle, kdy byl mechanismus zaveden jako náhrada dřívější závislosti požadavků OpenID4VP na DIF Presentation Exchange.
  • EUDI Wallet Architecture and Reference Framework stanoví OpenID4VP jako prezentační protokol a spolu s ním DCQL jako dotazovací mechanismus, který mají spoléhající se strany a peněženky v ekosystému podporovat.
  • Referenční implementace peněženek a ověřovatelů v programu EUDI Wallet Reference Implementation se sjednotily na DCQL. Nové integrace firemních peněženek postavené dnes na OpenID4VP by proto měly jako formát dotazů v požadavcích na prezentaci počítat s DCQL, nikoli s Presentation Exchange.

Související pojmy

Často kladené otázky

Jak se DCQL liší od DIF Presentation Exchange?

Obojí popisuje, co ověřovatel od peněženky požaduje, ale DCQL je omezen na OpenID4VP a definován přímo v této specifikaci, zatímco Presentation Exchange je samostatná specifikace DIF, která pokrývá i další protokoly. DCQL je záměrně menší: nemá skupiny input descriptorů ani submission requirements a omezení specifická pro formát, například mdoc doctype nebo typ SD-JWT VC, vyjadřuje přímo v objektu dotazu, nikoli prostřednictvím obecného filtru JSON Schema. Ekosystém EUDI Wallet standardizoval DCQL pro prezentace OpenID4VP.

Může jeden dotaz DCQL požadovat více než jedno osvědčení?

Ano. Pole credentials může obsahovat několik dotazů na osvědčení, každý s vlastním id. Peněženka, která má shodu pro všechny položky, vrátí jednu prezentaci pro každou položku. Volitelný objekt credential_sets pak může vyžadovat konkrétní kombinace, například přijmout buď samotné osvědčení o registraci společnosti, nebo osvědčení o registraci společnosti spolu s prohlášením o UBO, aniž by se držitele ptal dvakrát.

Jaký problém řeší claim_sets v rámci jednoho dotazu na osvědčení?

Osvědčení nemusí vždy obsahovat všechny údaje, které by ověřovatel chtěl. claim_sets uvádí alternativní skupiny id údajů, z nichž každá by sama o sobě požadavek splnila, seřazené od nejvíce po nejméně preferovanou. Peněženka vybere první skupinu, kterou dokáže plně splnit z údajů, které držitel skutečně má. Ověřovatel tak může požádat o přesné číslo průkazu, pokud je k dispozici, a jinak se spokojit s hrubší kontrolou, například příznakem věku nad 18 let, aniž by posílal dva samostatné požadavky.

Je DCQL určen pouze pro EUDI Wallet?

Ne. DCQL je součástí základní specifikace OpenID4VP a může jej používat jakákoli implementace OpenID4VP. Ekosystém EUDI Wallet je jeho významným uživatelem: Architecture and Reference Framework stanoví OpenID4VP s DCQL jako prezentační mechanismus, který musí spoléhající se strany podporovat. Proto je DCQL důležitý zejména pro peněženky a ověřovatele určené pro evropský trh.

Provádí DCQL sám selektivní zpřístupnění?

Ne. DCQL pouze popisuje, co se požaduje. Zda peněženka dokáže zpřístupnit právě tyto údaje a nic dalšího, závisí na formátu osvědčení: SD-JWT VC i ISO mdoc podporují zpřístupnění podmnožiny svých údajů, takže pole claims v DCQL na tuto podporu navazuje. DCQL by fungoval i s formátem bez selektivního zpřístupnění, ale držitel by pak musel i pro dotaz na jediný údaj zpřístupnit celé osvědčení.

Zdroje

  1. OpenID for Verifiable Presentations 1.0, oddíl Digital Credentials Query Language (DCQL)
  2. EUDI Wallet Architecture and Reference Framework
  3. Specifikace DIF Presentation Exchange 2.0.0

Tato stránka má informativní charakter a nepředstavuje právní poradenství. Závazné informace získáte přímo od OpenID Foundation a Evropské komise.

Promluvte si s námi o integraci EUDI Wallet