Vysvetlenie vydávania poverení OpenID4VCI: od ponuky po prijaté poverenie
OpenID4VCI, OpenID for Verifiable Credential Issuance, definuje, ako peňaženka žiada a prijíma poverenie od vydavateľa. Jedno vydanie prechádza niekoľkými samostatnými krokmi, kým peňaženka skutočne získa použiteľné poverenie, a každý z nich má svoj vlastný spôsob zlyhania. Táto stránka prevedie celým týmto životným cyklom, s vlastnými vzorovými príkladmi.
Dva spôsoby začiatku: vopred autorizovaný kód a autorizačný kód
Vydávanie sa často začína Credential Offer, ktorú zasiela vydavateľ, a grant, ktorý uvádza, určuje, ako peňaženka získa autorizáciu. Peňaženka môže vydávanie začať aj sama, bez akejkoľvek ponuky, pomocou toku s autorizačným kódom. Oba toky končia na tom istom mieste: peňaženka drží prístupový token, ktorý môže použiť na vyžiadanie poverenia.
Tok s vopred autorizovaným kódom
1. Vydavateľ
Už pozná držiteľa, vydá Credential Offer s pre-authorized_code
2. Peňaženka
Uplatní kód na token endpointe, voliteľne spolu s transakčným kódom
3. Peňaženka
Požiada o poverenie s dôkazom vlastníctva svojho kľúča
Tok s autorizačným kódom
1. Peňaženka
Naskenuje Credential Offer, ktorá uvádza grant authorization_code, alebo spustí tok sama bez ponuky
2. Autorizačný server
Prevedie držiteľa prihlásením a súhlasom, potom vydá kód
3. Peňaženka
Vymení kód za token a potom požiada o poverenie
Celý životný cyklus ponuky poverenia
Špecifikácia nedefinuje pomenované stavy, ale tok iniciovaný vydavateľom, v ktorom sa poverenie vydá okamžite, sa najľahšie sleduje ako postupnosť nižšie. Každý krok môže zlyhať svojím vlastným spôsobom a implementácia peňaženky musí zvládnuť tieto cesty, nielen tú úspešnú.
Vzorový príklad: osvedčenie o technickej spôsobilosti pre nákladnú flotilu
Orgán technickej kontroly vozidiel vydá osvedčenie o technickej spôsobilosti do firemnej peňaženky dopravnej spoločnosti po bežnej kontrole. Inšpektor už autentifikoval manažéra flotily priamo na mieste kontroly, takže vydavateľ použije tok s vopred autorizovaným kódom. Nasledujúce kroky sledujú toto jedno vydanie od ponuky až po prijaté poverenie.
Príklad zobrazuje základný OpenID4VCI. Nasadenia s vysokou úrovňou dôveryhodnosti, ako je EUDI Wallet, nad ním používajú profil HAIP, ktorý pridáva prístupové tokeny viazané cez DPoP, atestáciu peňaženky na token endpointe a atestáciu kľúča pre kľúče poverenia. Tie sú tu vynechané, aby každý krok zostal prehľadný.
1. Ponuka poverenia
Terminál orgánu technickej kontroly zobrazí QR kód. Obsahuje URI začínajúce na openid-credential-offer://, ktoré nesie ponuku nižšie, zakódovanú v URL v parametri credential_offer, alebo credential_offer_uri, z ktorej si ju peňaženka načíta. Peňaženka ho naskenuje a zistí, aké poverenie sa ponúka a ako ho získať.
Vydavateľ
Zobrazí QR kód s Credential Offer
Uvádza konfiguráciu poverenia a grant pre pre-authorized_code
{
"credential_issuer": "https://issuer.fleetinspect.example",
"credential_configuration_ids": ["roadworthiness_certificate"],
"grants": {
"urn:ietf:params:oauth:grant-type:pre-authorized_code": {
"pre-authorized_code": "fi-8f2c0b3a",
"tx_code": {
"length": 6,
"input_mode": "numeric",
"description": "Enter the code sent to your phone by text message"
}
}
}
}2. Zisťovanie metadát vydavateľa
Pred akoukoľvek žiadosťou si peňaženka načíta metadáta vydavateľa, aby zistila, čo obsahuje roadworthiness_certificate a ktoré endpointy má volať. Metadáta neuvádzajú žiadny samostatný autorizačný server, takže vydavateľ je svojím vlastným autorizačným serverom, a peňaženka si prečíta token endpoint z metadát tohto servera.
Peňaženka
GET /.well-known/openid-credential-issuer
Zistí formát poverenia, nároky a akceptované typy dôkazov, ako aj nonce, credential, deferred a notification endpointy
Metadáta vydavateľa poverení (výňatok)
{
"credential_issuer": "https://issuer.fleetinspect.example",
"nonce_endpoint": "https://issuer.fleetinspect.example/nonce",
"credential_endpoint": "https://issuer.fleetinspect.example/credential",
"deferred_credential_endpoint": "https://issuer.fleetinspect.example/deferred",
"notification_endpoint": "https://issuer.fleetinspect.example/notify",
"credential_configurations_supported": {
"roadworthiness_certificate": {
"format": "dc+sd-jwt",
"vct": "https://fleetinspect.example/vct/roadworthiness",
"cryptographic_binding_methods_supported": ["jwk"],
"credential_signing_alg_values_supported": ["ES256"],
"proof_types_supported": {
"jwt": { "proof_signing_alg_values_supported": ["ES256"] }
},
"credential_metadata": {
"claims": [
{ "path": ["vehicle_registration"] },
{ "path": ["inspection_result"] },
{ "path": ["valid_until"] }
]
}
}
}
}Metadáta autorizačného servera (výňatok), z /.well-known/oauth-authorization-server
{
"issuer": "https://issuer.fleetinspect.example",
"token_endpoint": "https://issuer.fleetinspect.example/token",
"pre-authorized_grant_anonymous_access_supported": true
}3. Žiadosť o token
Peňaženka uplatní vopred autorizovaný kód na token endpointe spolu s transakčným kódom, ktorý orgán technickej kontroly poslal na telefón manažéra flotily. Zaslanie tohto kódu druhým kanálom znamená, že niekto, kto odfotí QR kód cez rameno, ho aj tak nemôže uplatniť.
Peňaženka
POST /token
Odošle pre-authorized_code a tx_code, dostane prístupový token viazaný na túto ponuku
POST /token HTTP/1.1 Host: issuer.fleetinspect.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:pre-authorized_code &pre-authorized_code=fi-8f2c0b3a &tx_code=482913
Odpoveď
{
"access_token": "fi-at-3d91e0",
"token_type": "Bearer",
"expires_in": 86400
}4. Dôkaz vlastníctva
Keďže metadáta uvádzajú nonce_endpoint, peňaženka si tam najprv vyžiada čerstvý c_nonce. Následne dokáže, že vlastní súkromný kľúč, na ktorý bude poverenie viazané, tým, že podpíše proof JWT nad identifikátorom vydavateľa a týmto c_nonce.
Peňaženka
POST /nonce, potom podpíše proof JWT kľúčom, na ktorý bude poverenie viazané
Viaže poverenie na tento kľúč, nie iba na toho, kto vlastní prístupový token
POST /nonce HTTP/1.1 Host: issuer.fleetinspect.example
Odpoveď
{
"c_nonce": "fi-nonce-77aa"
}Peňaženka teraz zostaví proof JWT z dvoch JSON objektov, hlavičky a payloadu, a podpíše ich súkromným kľúčom, na ktorý bude poverenie viazané.
Hlavička: čo je tento JWT a ktorý kľúč ho podpísal
{
"typ": "openid4vci-proof+jwt",
"alg": "ES256",
"jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
}typ: označuje toto ako OpenID4VCI key proof, takže sa nedá zameniť s iným typom JWTalg: podpisovací algoritmus, jeden z tých, ktoré vydavateľ uviedol v proof_signing_alg_values_supportedjwk: verejný kľúč, na ktorý bude poverenie viazané; vydavateľ voči nemu overí podpis
Payload: pre koho je dôkaz určený a kedy vznikol
{
"aud": "https://issuer.fleetinspect.example",
"iat": 1789376400,
"nonce": "fi-nonce-77aa"
}aud: identifikátor vydavateľa, takže dôkaz sa nedá znovu použiť u iného vydavateľaiat: čas vytvorenia dôkazu, v sekundách od roku 1970nonce: c_nonce z nonce endpointu, ktorý dokazuje, že dôkaz je čerstvý
Podpísaný výsledok
Hlavička a payload sú každý zakódovaný v base64url a spojené bodkou. Peňaženka podpíše tento reťazec svojím súkromným kľúčom a pripojí base64url zakódovaný podpis za druhú bodku. Výsledný reťazec je proof JWT, ktorý peňaženka odošle v žiadosti o poverenie v kroku 5.
base64url(header) . base64url(payload) . base64url(signature) eyJ0eXAiOiJvcGVuaWQ0dmNpLXByb29mK2p3dCIs... .eyJhdWQiOiJodHRwczovL2lzc3Vlci5mbGVldGluc3BlY3QuZXhhbXBsZSIs... .<ES256 signature>
5. Žiadosť o poverenie
Peňaženka zavolá credential endpoint s prístupovým tokenom a dôkazom, a vydavateľ vygeneruje a vráti podpísané poverenie.
Peňaženka
POST /credential
Odošle prístupový token, id konfigurácie a proof JWT, dostane podpísané poverenie a notification_id
POST /credential HTTP/1.1
Host: issuer.fleetinspect.example
Content-Type: application/json
Authorization: Bearer fi-at-3d91e0
{
"credential_configuration_id": "roadworthiness_certificate",
"proofs": {
"jwt": ["<proof JWT from step 4>"]
}
}Odpoveď
{
"credentials": [
{ "credential": "<issuer-signed SD-JWT VC>" }
],
"notification_id": "fi-notif-9012"
}Celý tok na jeden pohľad
Tento sekvenčný diagram spája päť krokov vzorového príkladu dokopy, od ponuky až po notifikáciu. Plné šípky sú žiadosti, prerušované šípky sú odpovede a bodkovaná šípka je transakčný kód, ktorý cestuje mimo protokolu formou SMS správy.
Peňaženka
Firemná peňaženka dopravnej spoločnosti
Autorizačný server
V tomto príklade prevádzkovaný samotným vydavateľom
Vydavateľ poverení
Orgán technickej kontroly vozidiel
- Vydavateľ poverení do Peňaženka: Credential Offer zobrazená ako QR kód
- Vydavateľ poverení do Peňaženka: tx_code, zaslaný na telefón manažéra flotily formou SMS
- Peňaženka do Vydavateľ poverení: GET /.well-known/openid-credential-issuer
- Vydavateľ poverení do Peňaženka: metadáta vydavateľa poverení
- Peňaženka do Autorizačný server: GET /.well-known/oauth-authorization-server
- Autorizačný server do Peňaženka: metadáta autorizačného servera
- Peňaženka do Autorizačný server: POST /token: pre-authorized_code, tx_code
- Autorizačný server do Peňaženka: access_token
- Peňaženka do Vydavateľ poverení: POST /nonce
- Vydavateľ poverení do Peňaženka: c_nonce
- Peňaženka: podpíše proof JWT
- Peňaženka do Vydavateľ poverení: POST /credential: prístupový token, dôkazy
- Vydavateľ poverení do Peňaženka: credentials, notification_id
- Peňaženka: overí a uloží
- Peňaženka do Vydavateľ poverení: POST /notify: credential_accepted
- Vydavateľ poverení do Peňaženka: 204 No Content
Keď poverenie ešte nie je pripravené: odložené vydanie
Vyššie uvedený príklad predpokladá, že výsledok kontroly je už konečný. Ak namiesto toho orgán technickej kontroly musí hraničný výsledok postúpiť skúsenejšiemu inšpektorovi, credential endpoint nemôže poverenie vrátiť hneď, takže vydanie odloží.
Okamžité vydanie
Credential endpoint vráti podpísané poverenie v tej istej odpovedi ako žiadosť.
Odložené vydanie
Credential endpoint odpovie s HTTP 202, transaction_id a intervalom namiesto poverenia. Peňaženka opakovane volá deferred credential endpoint s týmto id, pričom čaká aspoň interval sekúnd medzi žiadosťami, kým poverenie nie je pripravené.
Odložená odpoveď z /credential
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"transaction_id": "fi-tx-55c2",
"interval": 900
}Opakované volanie /deferred, kým nie je pripravené
POST /deferred HTTP/1.1
Host: issuer.fleetinspect.example
Content-Type: application/json
Authorization: Bearer fi-at-3d91e0
{ "transaction_id": "fi-tx-55c2" }
// While the review is open: 202 with the same transaction_id and interval.
// Once approved: 200 with the credentials, optionally with a notification_id.
// If the review rejects the result: a credential_request_denied error.Uzavretie cyklu: notification endpoint
Po vydaní môže peňaženka vydavateľovi oznámiť, čo sa s poverením stalo, pomocou notification_id z odpovede na žiadosť o poverenie. Peňaženky nemusia tieto notifikácie posielať a doručenie nie je zaručené, takže vydavateľ nemôže chýbajúcu notifikáciu vykladať žiadnym spôsobom.
Peňaženka
Odošle udalosť na notification_endpoint vydavateľa pre notification_id, ktoré dostala, čo pokrýva každé poverenie v danej odpovedi
Uložené v peňaženke
Vydanie zlyhalo z iného dôvodu, napríklad poverenie neprešlo validáciou
Vydanie zlyhalo kvôli držiteľovi, napríklad odmietol poverenie uložiť
POST /notify HTTP/1.1
Host: issuer.fleetinspect.example
Content-Type: application/json
Authorization: Bearer fi-at-3d91e0
{
"notification_id": "fi-notif-9012",
"event": "credential_accepted"
}Súvisiace pojmy
Často kladené otázky
Ako peňaženka vie, ktorý typ grantu použiť?
Credential Offer uvádza grant vo svojom objekte grants. authorization_code je prítomný, keď vydavateľ chce, aby sa držiteľ v rámci toku prihlásil. pre-authorized_code je prítomný, keď bol držiteľ už autentifikovaný na kanáli, kde bola ponuka vytvorená, napríklad inšpektorom na mieste kontroly v uvedenom vzorovom príklade. Ponuka môže uvádzať oba, a peňaženka si potom jeden vyberie. Ak ponuka nemá vôbec objekt grants, peňaženka zistí, ktoré typy grantov autorizačný server podporuje, z jeho metadát.
Prečo si peňaženka načíta metadáta vydavateľa skôr, než o čokoľvek požiada?
Credential Offer uvádza iba credential_configuration_ids, URL vydavateľa a grants. Metadáta vydavateľa, poskytované zo well-known cesty, opisujú každú konfiguráciu: jej formát, jej nároky (claims) a typy dôkazov, ktoré akceptuje, ako aj nonce, credential, deferred a notification endpointy. Uvádzajú tiež, ktorý autorizačný server sa má použiť, a vlastné metadáta tohto servera poskytujú token endpoint. Bez oboch by peňaženka nevedela, ako zostaviť platné žiadosti ani čo zobraziť držiteľovi pred udelením súhlasu.
Čo presne dokazuje dôkaz vlastníctva?
Dokazuje, že peňaženka žiadajúca o poverenie vlastní súkromný kľúč, na ktorý bude poverenie viazané, nie iba to, že má platný prístupový token. Peňaženka podpíše proof JWT nad identifikátorom vydavateľa a čerstvým c_nonce z nonce endpointu vydavateľa, pomocou tohto kľúča. Vydavateľ vloží zodpovedajúci verejný kľúč do poverenia. Overovateľ, ktorý vyžaduje viazanie kľúča, požiada držiteľa, aby pri predložení podpísal opäť tým istým kľúčom, takže skopírované poverenie bez kľúča túto kontrolu nesplní.
Prečo by vydavateľ odkladal vydanie namiesto toho, aby poverenie vrátil hneď?
Niektoré kontroly, ktoré vydavateľ vykoná pred vygenerovaním poverenia, sa nedajú dokončiť v rámci jednej HTTP žiadosti, napríklad manuálna kontrola alebo volanie pomalého externého registra. Odložené vydanie umožňuje, aby credential endpoint odpovedal okamžite s transaction_id namiesto blokovania spojenia, a peňaženka opakovane volá deferred endpoint s týmto id, kým sa kontrola neskončí a poverenie nie je pripravené na prevzatie.
Je notification endpoint pre vydavateľa povinný?
Nie. Pre vydavateľov je voliteľný a ani peňaženky ho nemusia používať. Keď ho podporujú obe strany, vydavateľ sa dozvie, čo sa po vydaní stalo: poverenia boli uložené (credential_accepted), držiteľ vydanie prerušil, napríklad odmietol ich uložiť (credential_deleted), alebo zlyhalo z iného dôvodu (credential_failure). Doručenie nie je zaručené, takže vydavateľ by mal notifikáciu považovať za užitočnú informáciu, nikdy nie za spoľahlivý záznam, a z chýbajúcej notifikácie si nemôže nič odvodzovať.
Zdroje
Táto stránka má informatívny charakter a nepredstavuje právne poradenstvo. Pre záväzné usmernenie sa obráťte priamo na OpenID Foundation a Európsku komisiu.