Praleisti ir pereiti prie pagrindinio turinio

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ą

LaukasTipasPrivalomas
idstringM
formatenum: dc+sd-jwt | mso_mdoc | jwt_vc_json | ldp_vcM
metaobjektas, struktūra priklauso nuo formato
claimsduomenų užklausų masyvas
claim_setsduomenų id masyvų masyvas
trusted_authoritiesobjektų 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-jwt

Tikrintojas 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

reg_nolegal_name

Grąžinama, kai kredenciale yra abu duomenys

2. Atsarginis

legal_name

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

AND

Vienas iš

PVM registracija

OR

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ų

type: etsi_tl

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ų

reg_countryvalues:"NL""BE"

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

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

Šis puslapis yra informacinio pobūdžio ir nėra teisinė konsultacija. Autoritetingų nurodymų kreipkitės tiesiogiai į OpenID Foundation ir Europos Komisiją.

Pasikalbėkime apie EUDI Wallet integraciją