OpenID4VCI izdavanje vjerodajnica objašnjeno: od ponude do prihvaćene vjerodajnice
OpenID4VCI, OpenID za izdavanje provjerljivih vjerodajnica, definira kako novčanik zahtijeva i prima vjerodajnicu od izdavatelja. Jedno izdavanje prolazi kroz nekoliko zasebnih koraka prije nego novčanik zapravo dobije upotrebljivu vjerodajnicu, a svaki od njih ima svoj način neuspjeha. Ova stranica u cijelosti prolazi kroz taj životni ciklus, s izvornim razrađenim primjerima.
Dva načina početka: unaprijed autorizirani kod i autorizacijski kod
Izdavanje često počinje ponudom Credential Offer koju šalje izdavatelj, a odobrenje koje ona navodi određuje kako novčanik dobiva ovlaštenje. Novčanik može i sam pokrenuti izdavanje, bez ikakve ponude, koristeći tijek s autorizacijskim kodom. Oba tijeka završavaju na istom mjestu: novčanik posjeduje pristupni token koji može koristiti za zahtjev vjerodajnice.
Tijek s unaprijed autoriziranim kodom
1. Izdavatelj
Već poznaje nositelja, izdaje Credential Offer s pre-authorized_code kodom
2. Novčanik
Iskorištava kod na token krajnjoj točki, po potrebi uz transakcijski kod
3. Novčanik
Zahtijeva vjerodajnicu uz dokaz posjedovanja svog ključa
Tijek s autorizacijskim kodom
1. Novčanik
Skenira Credential Offer koji navodi authorization_code odobrenje, ili sam pokreće postupak bez ponude
2. Poslužitelj za autorizaciju
Provodi nositelja kroz prijavu i pristanak, zatim izdaje kod
3. Novčanik
Zamjenjuje kod za token, zatim zahtijeva vjerodajnicu
Cijeli životni ciklus ponude vjerodajnice
Specifikacija ne definira imenovana stanja, ali tijek koji pokreće izdavatelj, u kojem se vjerodajnica izdaje odmah, najlakše je pratiti u redoslijedu prikazanom u nastavku. Svaki korak može zakazati na svoj način, a implementacija novčanika mora obraditi te putanje, ne samo onu uspješnu.
Razrađen primjer: potvrda o tehničkoj ispravnosti za prijevozničku flotu
Tijelo za tehnički pregled vozila izdaje potvrdu o tehničkoj ispravnosti poslovnom novčaniku prijevozničke tvrtke nakon redovnog pregleda. Inspektor je već autentificirao voditelja flote na mjestu pregleda, pa izdavatelj koristi tijek s unaprijed autoriziranim kodom. Koraci u nastavku prate to pojedinačno izdavanje od ponude do prihvaćene vjerodajnice.
Primjer prikazuje osnovni OpenID4VCI. Implementacije visoke razine pouzdanosti, poput EUDI Wallet, na njemu grade HAIP profil, koji dodaje pristupne tokene vezane uz DPoP, atestiranje novčanika na token krajnjoj točki i atestiranje ključeva za ključeve vjerodajnice. To je ovdje izostavljeno kako bi svaki korak ostao pregledan.
1. Ponuda vjerodajnice
Terminal tijela za tehnički pregled prikazuje QR kod. Sadrži URI koji počinje s openid-credential-offer:// i koji nosi ponudu u nastavku, URL-kodiranu u parametru credential_offer, ili credential_offer_uri s kojeg je novčanik dohvaća. Novčanik ga skenira i očitava koja je vjerodajnica ponuđena i kako je preuzeti.
Izdavatelj
Prikazuje QR kod s Credential Offer ponudom
Navodi konfiguraciju vjerodajnice i pre-authorized_code odobrenje
{
"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. Otkrivanje metapodataka izdavatelja
Prije nego što išta zatraži, novčanik dohvaća metapodatke izdavatelja kako bi saznao što sadrži roadworthiness_certificate i koje krajnje točke treba pozivati. Metapodaci ne navode zasebne poslužitelje za autorizaciju, pa je izdavatelj sam sebi poslužitelj za autorizaciju, a novčanik čita token krajnju točku iz metapodataka tog poslužitelja.
Novčanik
GET /.well-known/openid-credential-issuer
Saznaje format vjerodajnice, tvrdnje i prihvaćene vrste dokaza, te krajnje točke za nonce, vjerodajnicu, odgodu i obavijesti
Metapodaci izdavatelja vjerodajnica (izvadak)
{
"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"] }
]
}
}
}
}Metapodaci poslužitelja za autorizaciju (izvadak), s /.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. Zahtjev za token
Novčanik iskorištava unaprijed autorizirani kod na token krajnjoj točki, zajedno s transakcijskim kodom koji je tijelo za tehnički pregled poslalo na telefon voditelja flote. To što se taj kod šalje drugim kanalom znači da onaj tko fotografira QR kod preko ramena i dalje ne može iskoristiti ponudu.
Novčanik
POST /token
Šalje pre-authorized_code i tx_code, prima pristupni token ograničen na tu ponudu
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
Odgovor
{
"access_token": "fi-at-3d91e0",
"token_type": "Bearer",
"expires_in": 86400
}4. Dokaz posjedovanja
Budući da metapodaci navode nonce_endpoint krajnju točku, novčanik prvo tamo dohvaća svježi c_nonce. Zatim dokazuje da posjeduje privatni ključ na koji će vjerodajnica biti vezana, potpisujući proof JWT preko identifikatora izdavatelja i tog c_nonce.
Novčanik
POST /nonce, zatim potpisuje proof JWT ključem na koji će vjerodajnica biti vezana
Veže vjerodajnicu uz taj ključ, a ne samo uz onoga tko posjeduje pristupni token
POST /nonce HTTP/1.1 Host: issuer.fleetinspect.example
Odgovor
{
"c_nonce": "fi-nonce-77aa"
}Novčanik sada gradi proof JWT iz dva JSON objekta, zaglavlja i sadržaja, i potpisuje ih privatnim ključem na koji će vjerodajnica biti vezana.
Zaglavlje: što je ovaj JWT i koji ga je ključ potpisao
{
"typ": "openid4vci-proof+jwt",
"alg": "ES256",
"jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
}typ: označava ovo kao OpenID4VCI dokaz ključa, tako da se ne može zamijeniti s bilo kojom drugom vrstom JWT-aalg: algoritam potpisivanja, jedan od onih koje je izdavatelj naveo u proof_signing_alg_values_supportedjwk: javni ključ na koji će vjerodajnica biti vezana; izdavatelj prema njemu provjerava potpis
Sadržaj: za koga je dokaz namijenjen i kada je izrađen
{
"aud": "https://issuer.fleetinspect.example",
"iat": 1789376400,
"nonce": "fi-nonce-77aa"
}aud: identifikator izdavatelja, tako da se dokaz ne može ponovno iskoristiti kod drugog izdavateljaiat: vrijeme kada je dokaz stvoren, u sekundama od 1970.nonce: c_nonce s nonce krajnje točke, koji pokazuje da je dokaz svjež
Potpisani rezultat
Zaglavlje i sadržaj su svaki zasebno base64url kodirani i spojeni točkom. Novčanik potpisuje taj niz svojim privatnim ključem i dodaje base64url kodirani potpis nakon druge točke. Dobiveni niz je proof JWT koji novčanik šalje u zahtjevu za vjerodajnicu u 5. koraku.
base64url(header) . base64url(payload) . base64url(signature) eyJ0eXAiOiJvcGVuaWQ0dmNpLXByb29mK2p3dCIs... .eyJhdWQiOiJodHRwczovL2lzc3Vlci5mbGVldGluc3BlY3QuZXhhbXBsZSIs... .<ES256 signature>
5. Zahtjev za vjerodajnicu
Novčanik poziva krajnju točku za vjerodajnice s pristupnim tokenom i dokazom, a izdavatelj izdaje i vraća potpisanu vjerodajnicu.
Novčanik
POST /credential
Šalje pristupni token, identifikator konfiguracije i proof JWT, prima potpisanu vjerodajnicu i notification_id identifikator
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>"]
}
}Odgovor
{
"credentials": [
{ "credential": "<issuer-signed SD-JWT VC>" }
],
"notification_id": "fi-notif-9012"
}Cijeli tijek na jedan pogled
Ovaj dijagram slijeda spaja pet koraka razrađenog primjera, od ponude do obavijesti. Pune strelice su zahtjevi, isprekidane strelice su odgovori, a točkasta strelica prikazuje transakcijski kod koji putuje izvan protokola SMS porukom.
Novčanik
Poslovni novčanik prijevozničke tvrtke
Poslužitelj za autorizaciju
U ovom primjeru njime upravlja sam izdavatelj
Izdavatelj vjerodajnica
Tijelo za tehnički pregled vozila
- Izdavatelj vjerodajnica prema Novčanik: Credential Offer, prikazana kao QR kod
- Izdavatelj vjerodajnica prema Novčanik: tx_code, poslan voditelju flote SMS porukom na telefon
- Novčanik prema Izdavatelj vjerodajnica: GET /.well-known/openid-credential-issuer
- Izdavatelj vjerodajnica prema Novčanik: metapodaci izdavatelja vjerodajnica
- Novčanik prema Poslužitelj za autorizaciju: GET /.well-known/oauth-authorization-server
- Poslužitelj za autorizaciju prema Novčanik: metapodaci poslužitelja za autorizaciju
- Novčanik prema Poslužitelj za autorizaciju: POST /token: pre-authorized_code, tx_code
- Poslužitelj za autorizaciju prema Novčanik: access_token
- Novčanik prema Izdavatelj vjerodajnica: POST /nonce
- Izdavatelj vjerodajnica prema Novčanik: c_nonce
- Novčanik: potpisuje proof JWT
- Novčanik prema Izdavatelj vjerodajnica: POST /credential: pristupni token, dokazi
- Izdavatelj vjerodajnica prema Novčanik: credentials, notification_id
- Novčanik: provjerava i pohranjuje
- Novčanik prema Izdavatelj vjerodajnica: POST /notify: credential_accepted
- Izdavatelj vjerodajnica prema Novčanik: 204 No Content
Kada vjerodajnica još nije spremna: odgođeno izdavanje
Gornji primjer pretpostavlja da je rezultat pregleda već konačan. Ako tijelo za tehnički pregled umjesto toga treba eskalirati granični rezultat višem inspektoru, krajnja točka za vjerodajnice ne može odmah vratiti vjerodajnicu, pa odgađa izdavanje.
Trenutno izdavanje
Krajnja točka za vjerodajnice vraća potpisanu vjerodajnicu u istom odgovoru kao i zahtjev.
Odgođeno izdavanje
Krajnja točka za vjerodajnice odgovara s HTTP 202 statusom, transaction_id identifikatorom i intervalom. Novčanik ispituje odgođenu krajnju točku za vjerodajnice tim identifikatorom, čekajući barem interval sekundi između zahtjeva, dok vjerodajnica ne bude spremna.
Odgođeni odgovor s /credential
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"transaction_id": "fi-tx-55c2",
"interval": 900
}Ispitivanje /deferred dok ne bude spremno
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.Zatvaranje kruga: krajnja točka za obavijesti
Nakon izdavanja novčanik može obavijestiti izdavatelja o tome što se dogodilo s vjerodajnicom, koristeći notification_id iz odgovora s vjerodajnicom. Novčanici nisu obvezni slati te obavijesti, a isporuka nije zajamčena, pa izdavatelj ne smije nedostatak obavijesti tumačiti kao bilo što.
Novčanik
Šalje događaj na notification_endpoint krajnju točku izdavatelja za primljeni notification_id, koji obuhvaća sve vjerodajnice u tom odgovoru
Pohranjeno u novčaniku
Izdavanje nije uspjelo iz nekog drugog razloga, na primjer vjerodajnica nije prošla provjeru valjanosti
Izdavanje nije uspjelo zbog nositelja, na primjer odbio je pohraniti je
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"
}Povezani pojmovi
Često postavljana pitanja
Kako novčanik zna koju vrstu odobrenja koristiti?
Credential Offer navodi odobrenje u svom grants objektu. authorization_code je prisutan kada izdavatelj želi da se nositelj prijavi kao dio postupka. pre-authorized_code je prisutan kada je nositelj već autentificiran na kanalu na kojem je ponuda stvorena, na primjer od strane inspektora na mjestu pregleda u razrađenom primjeru u nastavku. Ponuda može navesti oboje, a novčanik tada bira jedno. Ako ponuda uopće nema grants objekt, novčanik provjerava koje vrste odobrenja poslužitelj za autorizaciju podržava u svojim metapodacima.
Zašto novčanik dohvaća metapodatke izdavatelja prije nego što bilo što zatraži?
Credential Offer navodi samo credential_configuration_ids identifikatore, URL izdavatelja i grants objekt. Metapodaci izdavatelja, poslužuju se s dobro poznate putanje, opisuju svaku konfiguraciju: njezin format, njezine tvrdnje i vrste dokaza koje prihvaća, te krajnje točke za nonce, vjerodajnicu, odgodu i obavijesti. Također navode koji poslužitelj za autorizaciju treba koristiti, a metapodaci tog poslužitelja daju token krajnju točku. Bez oboje novčanik ne bi znao kako izraditi valjane zahtjeve niti što prikazati nositelju prije nego što pristane.
Što zapravo dokazuje dokaz posjedovanja?
Dokazuje da novčanik koji traži vjerodajnicu posjeduje privatni ključ na koji će vjerodajnica biti vezana, a ne samo da ima valjani pristupni token. Novčanik tim ključem potpisuje proof JWT preko identifikatora izdavatelja i svježeg c_nonce vrijednosti dobivene s nonce krajnje točke izdavatelja. Izdavatelj ugrađuje odgovarajući javni ključ u vjerodajnicu. Provjeritelj koji zahtijeva vezanje ključa traži od nositelja da pri predočenju ponovno potpiše istim ključem, tako da kopirana vjerodajnica bez ključa ne prolazi tu provjeru.
Zašto bi izdavatelj odgodio izdavanje umjesto da odmah vrati vjerodajnicu?
Neke provjere koje izdavatelj provodi prije izdavanja vjerodajnice ne mogu se dovršiti unutar jednog HTTP zahtjeva, na primjer ručna provjera ili poziv sporom vanjskom registru. Odgođeno izdavanje omogućuje krajnjoj točki za vjerodajnice da odmah odgovori s transaction_id identifikatorom umjesto blokiranja veze, a novčanik tim identifikatorom ispituje odgođenu krajnju točku dok provjera ne završi i vjerodajnica ne bude spremna za preuzimanje.
Je li krajnja točka za obavijesti obvezna za izdavatelja?
Ne. Za izdavatelje je neobavezna, a ni novčanici je nisu obvezni koristiti. Kada je oboje podržavaju, izdavatelj saznaje što se dogodilo nakon izdavanja: vjerodajnice su pohranjene (credential_accepted), nositelj je prekinuo izdavanje, na primjer odbivši ih pohraniti (credential_deleted), ili je izdavanje neuspjelo iz nekog drugog razloga (credential_failure). Isporuka nije zajamčena, pa izdavatelj obavijest treba tretirati kao korisnu informaciju, nikada kao pouzdanu evidenciju, i ne smije ništa zaključivati iz njezinog izostanka.
Izvori
Ova stranica ima informativni karakter i ne predstavlja pravni savjet. Za mjerodavne smjernice obratite se izravno OpenID Foundationu i Europskoj komisiji.