Ugrás a fő tartalomra

A DCQL röviden: így kéri az ellenőrző pontosan azt a tárcától, amire szüksége van

A Digital Credentials Query Language, röviden DCQL, az a JSON-alapú lekérdezési formátum, amelyet az OpenID4VP a prezentációs kérésben használ. Segítségével az elfogadó fél leírhatja, mely igazolásokat és azokon belül mely adatokat szeretné látni, úgy, hogy bármely megfelelő tárca egyedi integráció nélkül értelmezni tudja.

A probléma, amelyet a DCQL megold

Egy üzleti tárca többféle formátumú igazolást is tárolhat: SD-JWT VC formátumú cégbejegyzést, mdoc kódolású szakmai képesítést vagy egy korábbi pilotból származó W3C ellenőrizhető igazolást. Az az ellenőrző, amelynek csak a cégjegyzékszámot és a cégnevet kell megerősítenie, nem tudja formátumokon átívelő, hordozható módon pontosan ezt kérni. Vagy a teljes igazolást kell elfogadnia, vagy kézzel kell külön kérést írnia minden formátumhoz és minden tárcaszállítóhoz.

A DCQL ezt a hiányt a kérés oldalán szünteti meg. Egyetlen JSON-objektumról van szó az OpenID4VP engedélyezési kérésben, amely egy vagy több igazoláslekérdezést nevez meg, mindegyiket egy formátumhoz és adatútvonalak készletéhez kötve. A tárca kiértékeli a lekérdezést a tárolt igazolásokon, megállapítja, melyek egyeznek, és csak ezután kéri a birtokost, hogy hagyja jóvá éppen ezeknek az adatoknak az átadását. Az ellenőrző kiszámítható szerkezetet kap, függetlenül attól, hogy a birtokos melyik tárcát használta.

1. Ellenőrző

OpenID4VP kérést küld dcql_query objektummal

2. Tárca

Összeveti a lekérdezést a tárolt igazolásokkal

3. Birtokos

Csak a kért adatok átadását hagyja jóvá

4. Ellenőrző

Igazoláslekérdezés-id-nként egy prezentációt kap

A DCQL lekérdezés felépítése

A DCQL lekérdezés egyetlen JSON-objektum, amely egy credentials tömböt és opcionálisan egy credential_sets tömböt tartalmaz. A credentials minden eleme egy igazoláslekérdezés. Az M jelölésű mezők az adott lekérdezésben kötelezők.

dcql_query

credentials[ ]

Minden szükséges igazoláshoz egy lekérdezés

id + format

Melyik igazolás, milyen formátumban

meta

Típusszűrő, például vct_values

claims[ ]

Az átadandó adatok útvonalai

claim_sets[ ]

Elfogadható adatkombinációk

credential_sets[ ]

Opcionális: az igazoláslekérdezések mely kombinációi teljesítik a kérést

MezőTípusKötelező
idstringM
formatenum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vcM
metaobjektum, szerkezete a formátumtól függ
claimsadatlekérdezések tömbje
claim_setsadatazonosító-tömbök tömbje
trusted_authoritiestype és values mezőjű objektumok tömbje

A claims minden eleme maga is objektum: egy id, amellyel a claim_sets hivatkozik rá, egy path, vagyis egy tömb, amely megadja az adat helyét az igazoláson belül (például ["legal_name"] egy legfelső szintű SD-JWT adatnál, vagy ["org", "registration_number"] egy beágyazottnál), valamint opcionálisan values, azoknak az értékeknek a listája, amelyek egyikének az adatnak meg kell felelnie.

Gyakorlati példa: cégbejegyzés ellenőrzése

Cégbejegyzés

dc+sd-jwt

Az ellenőrző: ezt szeretném megkapni

  • ✓ Cégjegyzékszámreg_nopath: ["registration_number"]
  • ✓ Cégnévlegal_namepath: ["legal_name"]
  • ✓ Bejegyzés országareg_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élda a tárca válaszára

A tárca egy vp_token objektummal válaszol, amelynek kulcsai az igazoláslekérdezések id-i. Minden érték prezentációk tömbje. dc+sd-jwt esetén egy prezentáció a kibocsátó által aláírt JWT-ből, minden átadott adathoz egy disclosure-ből, valamint egy key binding JWT-ből áll, amely a prezentációt a kérés nonce-ához és klienséhez köti.

Amit a tárca küld

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

Az ellenőrző által validálás után látott adatok

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

Tartalék megoldás kérése: claim_sets

A claim_sets adatazonosító-csoportokat sorol fel preferencia szerinti sorrendben. A tárca az első olyan csoportot adja vissza, amelyet a birtokos tényleges adataiból teljesen ki tud elégíteni, így az ellenőrzőnek nem kell két külön kérést küldenie a pontos és a tartalék esetre.

Gyakorlati példa: cégjegyzékszám, vagy tartalékként csak a cégnév

1. Előnyben részesített

reg_nolegal_name

Akkor adja vissza, ha az igazolás mindkét adatot tartalmazza

2. Tartalék

legal_name

Csak akkor adja vissza, ha az első készlet nem teljesíthető

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

Itt az ellenőrző a cégjegyzékszámot és a cégnevet együtt részesíti előnyben, de a cégnevet önmagában is elfogadja, ha a birtokos igazolása nem tartalmaz cégjegyzékszám adatot.

Példaválasz: a tartalék készlet teljesült

Amit a tárca küld

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

Az ellenőrző által validálás után látott adatok

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

A birtokos igazolásában nincs cégjegyzékszám, ezért a tárca a második adatkészletet teljesítette, és egyetlen disclosure-t adott át. A válasz nem jelzi, melyik készletet használta: ezt az ellenőrző a kapott adatokból olvassa ki.

Igazolások kombinálása: credential_sets

A credential_sets eggyel magasabb szinten működik, mint a claim_sets. Minden bejegyzés options listát tartalmaz, ahol minden opció igazoláslekérdezés-id-k csoportja. A tárcának minden kötelező bejegyzésből egy opciót kell teljesítenie, így az ellenőrző egyetlen kérésben alkalmazhat ÉS, illetve VAGY logikát több igazoláson át.

Kötelező

Cégbejegyzés

AND

Egy ezek közül

Áfa-regisztráció

OR

Egy ezek közül

Bankszámla-igazolás

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

Példaválasz: cégbejegyzés és bankszámla

Amit a tárca küld

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

Az ellenőrző által validálás után látott adatok

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

A birtokosnak nincs áfa-regisztrációs igazolása, ezért a tárca a második készlet második opcióját választotta. A fel nem használt lekérdezés-id-k, itt a vat_registration, egyszerűen hiányoznak a vp_token objektumból.

Csak megbízható kibocsátók: trusted_authorities

A trusted_authorities olyan igazolásokra szűkíti a lekérdezést, amelyek kibocsátója mögött az ellenőrző által megbízhatónak tartott szervezet áll. Minden bejegyzésnek van egy type mezője és egy values listája: aki a szervezeti kulcsazonosítóhoz, etsi_tl egy ETSI bizalmi listához, vagy openid_federation egy föderációs bizalmi horgonyhoz. A tárca csak az egyező igazolásokat ajánlja fel.

Gyakorlati példa: cégigazolás listán szereplő kibocsátótól

Az ellenőrző: csak az erről a bizalmi listáról származó kibocsátóktól

type: etsi_tl

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

Cégigazolás listán szereplő kibocsátótól

a kibocsátó szerepel a bizalmi listán

✓ Megfelel a lekérdezésnek

Cégigazolás listán nem szereplő kibocsátótól

a kibocsátó nem szerepel a bizalmi listán

✗ Nem felel meg, a birtokos nem kapja meg ajánlatként

{
  "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éldaválasz: csak a listán szereplő kibocsátó igazolása

Amit a tárca küld

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

Az ellenőrző által validálás után látott adatok

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

A birtokosnak egy listán nem szereplő kibocsátótól is volt cégigazolása, de a tárca azt nem ajánlotta fel. A trusted_authorities a tárcának szóló szűrő, nem garancia: az ellenőrző a prezentáció validálásakor maga is ellenőrzi a kibocsátót a bizalmi lista alapján.

Értékegyezés: claims.values

Egy adatlekérdezés tartalmazhat values listát, amely karakterláncokból, egész számokból vagy logikai értékekből áll. A tárca csak akkor adja vissza az adatot, ha annak típusa és értéke pontosan megegyezik valamelyikkel, így az ellenőrző feltételt ellenőrizhet anélkül, hogy előbb bármi mást kérne.

Gyakorlati példa: csak Hollandiában vagy Belgiumban bejegyzett cégek

Az ellenőrző: csak ezen országok egyikében bejegyzett cég

reg_countryvalues:"NL""BE"

Holland cég

registration_country: "NL"

✓ Megfelel a lekérdezésnek

Német cég

registration_country: "DE"

✗ Nem felel meg, a birtokos nem kapja meg ajánlatként

{
  "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éldaválasz: holland cég

Amit a tárca küld

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

Az ellenőrző által validálás után látott adatok

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

Egy német cég igazolásában a registration_country értéke "DE", így nem felel meg a lekérdezésnek, és a tárcának nincs mit visszaadnia hozzá. Az ellenőrzőnek ennek ellenére a validált adatokban is ellenőriznie kell az értéket, ahelyett hogy a tárca szűrésére hagyatkozna.

Formátumspecifikus megkötések a meta mezőben

SD-JWT VC: vct_values

dc+sd-jwt esetén a meta.vct_values azokat az igazolástípus-azonosítókat sorolja fel, amelyeket az ellenőrző elfogad. A lekérdezés csak olyan tárolt igazolásra illeszkedik, amelynek vct értéke a felsoroltak egyike, így az az ellenőrző, amely csak egy kibocsátó cégigazolás-típusában bízik, pontosan azt az azonosítót adja meg.

mso_mdoc: doctype_value és névtér

mso_mdoc esetén a meta.doctype_value rögzíti az ISO 18013-5 szerinti DocType-ot, és minden adatútvonal annak az mdoc névtérnek a nevével kezdődik, amelybe az adat tartozik, nem egyszerű mezőnévvel, mivel az mdoc az adatokat névterek szerint csoportosítja, nem lapos objektumban.

Hol tart ma a DCQL

  • A DCQL-t magában az OpenID4VP specifikációban definiálják, nem külön dokumentumban, és azóta része a tervezetnek, hogy a mechanizmust bevezették az OpenID4VP kérések korábbi, DIF Presentation Exchange-től való függőségének kiváltására.
  • Az EUDI Wallet Architecture and Reference Framework az OpenID4VP-t írja elő prezentációs protokollként, és vele együtt a DCQL-t lekérdezési mechanizmusként, amelyet az ökoszisztéma elfogadó feleinek és tárcáinak támogatniuk kell.
  • Az EUDI Wallet Reference Implementation program tárca- és ellenőrző-referenciaimplementációi a DCQL-re álltak át. Ezért a ma OpenID4VP-re épülő új üzleti tárca-integrációknak a prezentációs kérések lekérdezési formátumaként a DCQL-lel kell számolniuk, nem a Presentation Exchange-dzsel.

Kapcsolódó fogalmak

Gyakran ismételt kérdések

Miben különbözik a DCQL a DIF Presentation Exchange-től?

Mindkettő azt írja le, mit kér az ellenőrző a tárcától, de a DCQL az OpenID4VP-re korlátozódik, és közvetlenül abban a specifikációban van definiálva, míg a Presentation Exchange önálló DIF-specifikáció, amely más protokollokat is lefed. A DCQL szándékosan kisebb: nincsenek benne input descriptor csoportok vagy submission requirements, és a formátumspecifikus megkötéseket, például az mdoc doctype-ot vagy az SD-JWT VC típust, közvetlenül a lekérdezési objektumban fejezi ki, nem egy általános JSON Schema szűrőn keresztül. Az EUDI Wallet ökoszisztéma a DCQL-t szabványosította az OpenID4VP prezentációkhoz.

Kérhet egy DCQL lekérdezés egynél több igazolást?

Igen. A credentials tömb több igazoláslekérdezést is tartalmazhat, mindegyiket saját id-vel. Ha a tárcában minden bejegyzéshez van egyező igazolás, bejegyzésenként egy prezentációt ad vissza. Az opcionális credential_sets objektum emellett konkrét kombinációkat is előírhat, például elfogadhatja csak a cégbejegyzési igazolást, vagy a cégbejegyzési igazolást egy UBO-nyilatkozattal együtt, anélkül hogy kétszer kérdezné meg a birtokost.

Milyen problémát old meg a claim_sets egyetlen igazoláslekérdezésen belül?

Egy igazolás nem mindig tartalmazza az összes adatot, amelyet az ellenőrző szeretne. A claim_sets adatazonosítók alternatív csoportjait sorolja fel, amelyek közül bármelyik önmagában is teljesítené a kérést, a leginkább preferálttól a legkevésbé preferáltig rendezve. A tárca az első olyan csoportot választja, amelyet a birtokos ténylegesen meglévő adataiból teljesen ki tud elégíteni. Így az ellenőrző kérhet pontos igazolványszámot, ha van ilyen, és ha nincs, beérheti egy durvább ellenőrzéssel, például egy 18 év feletti jelzővel, két külön kérés küldése nélkül.

A DCQL csak az EUDI Wallethez használható?

Nem. A DCQL az OpenID4VP alapspecifikáció része, és bármely OpenID4VP-implementáció használhatja. Az EUDI Wallet ökoszisztéma kiemelt alkalmazója: az Architecture and Reference Framework az OpenID4VP-t a DCQL-lel együtt olyan prezentációs mechanizmusként írja elő, amelyet az elfogadó feleknek támogatniuk kell. Ezért különösen fontos az európai piacra készülő tárcák és ellenőrzők számára.

Maga a DCQL végzi a szelektív adatfeltárást?

Nem. A DCQL csak azt írja le, mit kérnek. Az, hogy a tárca pontosan ezeket az adatokat tudja-e átadni, és semmi mást, az igazolás formátumától függ: az SD-JWT VC és az ISO mdoc is támogatja adataik egy részhalmazának feltárását, így a DCQL claims tömbje erre a támogatásra épül. A DCQL olyan formátummal is működne, amely nem támogatja a szelektív feltárást, de ekkor a birtokosnak még egy egyetlen adatra vonatkozó lekérdezés teljesítéséhez is a teljes igazolást át kellene adnia.

Források

  1. OpenID for Verifiable Presentations 1.0, Digital Credentials Query Language (DCQL) szakasz
  2. EUDI Wallet Architecture and Reference Framework
  3. DIF Presentation Exchange 2.0.0 specifikáció

Ez az oldal tájékoztató jellegű, és nem minősül jogi tanácsadásnak. Hiteles útmutatásért forduljon közvetlenül az OpenID Foundationhöz és az Európai Bizottsághoz.

Beszéljünk az EUDI Wallet integrációról