OpenID4VCI akreditācijas datu izsniegšana izskaidrota: no piedāvājuma līdz pieņemtiem akreditācijas datiem
OpenID4VCI, OpenID for Verifiable Credential Issuance, nosaka, kā maks pieprasa un saņem akreditācijas datus no izdevēja. Viena izsniegšana norit vairākos atsevišķos soļos, pirms makam ir izmantojami akreditācijas dati, un katram no tiem ir savs kļūmes veids. Šī lapa pilnībā izklāsta šo dzīves ciklu ar oriģināliem izstrādātiem piemēriem.
Divi veidi, kā sākt: iepriekš autorizēts kods un autorizācijas kods
Izsniegšana bieži sākas ar Credential Offer, ko nosūta izdevējs, un tajā norādītais piešķīrums nosaka, kā maks tiek autorizēts. Maks var arī pats sākt izsniegšanu bez jebkāda piedāvājuma, izmantojot autorizācijas koda plūsmu. Abas plūsmas beidzas vienā un tajā pašā vietā: makam ir piekļuves marķieris, ko tas var izmantot, lai pieprasītu akreditācijas datus.
Iepriekš autorizēta koda plūsma
1. Izdevējs
Jau pazīst turētāju, izsniedz Credential Offer ar pre-authorized_code kodu
2. Maks
Izmanto kodu marķiera galapunktā, pēc izvēles kopā ar darījuma kodu
3. Maks
Pieprasa akreditācijas datus, pierādot sava atslēgas turējumu
Autorizācijas koda plūsma
1. Maks
Skenē Credential Offer, kas norāda authorization_code piešķīrumu, vai pats sāk procesu bez piedāvājuma
2. Autorizācijas serveris
Ved turētāju cauri pieteikšanās un piekrišanas procesam, tad izsniedz kodu
3. Maks
Apmaina kodu pret marķieri, tad pieprasa akreditācijas datus
Pilnais akreditācijas datu piedāvājuma dzīves cikls
Specifikācija nedefinē nosauktus stāvokļus, taču izdevēja iniciētu plūsmu, kurā akreditācijas dati tiek izsniegti uzreiz, ir vienkāršāk sekot tālāk redzamajā secībā. Katrs solis var neizdoties savā veidā, un maka implementācijai ir jāapstrādā šie ceļi, ne tikai veiksmīgais.
Izstrādāts piemērs: braukšanas derīguma sertifikāts kravas autoparkam
Transportlīdzekļu tehniskās apskates iestāde izsniedz braukšanas derīguma sertifikātu kravas pārvadājumu uzņēmuma biznesa makam pēc kārtējās apskates. Inspektors jau bija autentificējis autoparka vadītāju apskates vietā, tāpēc izdevējs izmanto iepriekš autorizēta koda plūsmu. Tālāk redzamie soļi seko šai vienai izsniegšanai no piedāvājuma līdz pieņemtiem akreditācijas datiem.
Piemērs parāda pamata OpenID4VCI. Augstas uzticamības ieviešanas, piemēram, EUDI Wallet, tam virsū seko HAIP profilam, kas pievieno DPoP piesaistītus piekļuves marķierus, maka apliecinājumu marķiera galapunktā un atslēgas apliecinājumu akreditācijas datu atslēgām. Tie šeit ir izlaisti, lai katrs solis paliktu viegli lasāms.
1. Akreditācijas datu piedāvājums
Apskates iestādes termināls rāda QR kodu. Tas satur URI, kas sākas ar openid-credential-offer:// un satur tālāk redzamo piedāvājumu, URL kodētu credential_offer parametrā, vai credential_offer_uri, no kura maks to iegūst. Maks to skenē un nolasa, kuri akreditācijas dati tiek piedāvāti un kā tos iegūt.
Izdevējs
Rāda QR kodu ar Credential Offer
Norāda akreditācijas datu konfigurāciju un pre-authorized_code piešķīrumu
{
"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. Izdevēja metadatu atklāšana
Pirms kaut ko pieprasīt, maks iegūst izdevēja metadatus, lai uzzinātu, ko satur roadworthiness_certificate un kurus galapunktus izsaukt. Metadati neuzskaita atsevišķus autorizācijas serverus, tāpēc izdevējs ir savs paša autorizācijas serveris, un maks nolasa marķiera galapunktu no šī servera metadatiem.
Maks
GET /.well-known/openid-credential-issuer
Uzzina akreditācijas datu formātu, apgalvojumus un pieņemtos pierādījumu veidus, kā arī nonce, akreditācijas datu, atliktās izsniegšanas un paziņojumu galapunktus
Akreditācijas datu izdevēja metadati (izvilkums)
{
"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"] }
]
}
}
}
}Autorizācijas servera metadati (izvilkums), no /.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. Marķiera pieprasījums
Maks izmanto iepriekš autorizēto kodu marķiera galapunktā kopā ar darījuma kodu, ko apskates iestāde nosūtīja autoparka vadītāja tālrunim. Tas, ka šis kods tiek sūtīts pa otru kanālu, nozīmē, ka kāds, kurš nofotografē QR kodu pār pleciem, joprojām nevar to izmantot.
Maks
POST /token
Nosūta pre-authorized_code un tx_code, saņem piekļuves marķieri, kas ierobežots ar šo piedāvājumu
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
Atbilde
{
"access_token": "fi-at-3d91e0",
"token_type": "Bearer",
"expires_in": 86400
}4. Turējuma pierādījums
Tā kā metadati uzskaita nonce_endpoint, maks vispirms iegūst no turienes svaigu c_nonce. Pēc tam tas pierāda, ka tur privāto atslēgu, kurai akreditācijas dati tiks piesaistīti, parakstot proof JWT pār izdevēja identifikatoru un šo c_nonce.
Maks
POST /nonce, tad paraksta proof JWT ar atslēgu, kurai akreditācijas dati tiks piesaistīti
Piesaista akreditācijas datus šai atslēgai, nevis tikai tam, kurš tur piekļuves marķieri
POST /nonce HTTP/1.1 Host: issuer.fleetinspect.example
Atbilde
{
"c_nonce": "fi-nonce-77aa"
}Tagad maks veido proof JWT no diviem JSON objektiem, galvenes un lietderīgās kravas, un paraksta tos ar privāto atslēgu, kurai akreditācijas dati tiks piesaistīti.
Galvene: kas ir šis JWT un kura atslēga to parakstīja
{
"typ": "openid4vci-proof+jwt",
"alg": "ES256",
"jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
}typ: atzīmē, ka šis ir OpenID4VCI atslēgas pierādījums, lai to nevarētu sajaukt ar cita veida JWTalg: parakstīšanas algoritms, viens no tiem, ko izdevējs norādījis proof_signing_alg_values_supportedjwk: publiskā atslēga, kurai akreditācijas dati tiks piesaistīti; izdevējs pārbauda parakstu pret to
Lietderīgā krava: kam pierādījums paredzēts un kad tas izveidots
{
"aud": "https://issuer.fleetinspect.example",
"iat": 1789376400,
"nonce": "fi-nonce-77aa"
}aud: izdevēja identifikators, lai pierādījumu nevarētu atkārtoti izmantot pie cita izdevējaiat: brīdis, kad pierādījums tika izveidots, sekundēs kopš 1970. gadanonce: c_nonce no nonce galapunkta, kas parāda, ka pierādījums ir svaigs
Parakstītais rezultāts
Galvene un lietderīgā krava katra atsevišķi tiek kodētas base64url formātā un savienotas ar punktu. Maks paraksta šo virkni ar savu privāto atslēgu un pievieno base64url kodēto parakstu pēc otra punkta. Iegūtā virkne ir proof JWT, ko maks nosūta akreditācijas datu pieprasījumā 5. solī.
base64url(header) . base64url(payload) . base64url(signature) eyJ0eXAiOiJvcGVuaWQ0dmNpLXByb29mK2p3dCIs... .eyJhdWQiOiJodHRwczovL2lzc3Vlci5mbGVldGluc3BlY3QuZXhhbXBsZSIs... .<ES256 signature>
5. Akreditācijas datu pieprasījums
Maks izsauc akreditācijas datu galapunktu ar piekļuves marķieri un pierādījumu, un izdevējs izveido un atgriež parakstītos akreditācijas datus.
Maks
POST /credential
Nosūta piekļuves marķieri, konfigurācijas identifikatoru un proof JWT, saņem parakstītos akreditācijas datus un 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>"]
}
}Atbilde
{
"credentials": [
{ "credential": "<issuer-signed SD-JWT VC>" }
],
"notification_id": "fi-notif-9012"
}Visa plūsma vienā skatā
Šī secības diagramma apkopo izstrādātā piemēra piecus soļus, no piedāvājuma līdz paziņojumam. Nepārtrauktas bultas ir pieprasījumi, pārtrauktas bultas ir atbildes, un punktotā bulta ir darījuma kods, kas ceļo ārpus protokola ar īsziņu.
Maks
Kravas pārvadājumu uzņēmuma biznesa maks
Autorizācijas serveris
Šajā piemērā to pārvalda pats izdevējs
Akreditācijas datu izdevējs
Transportlīdzekļu tehniskās apskates iestāde
- Akreditācijas datu izdevējs uz Maks: Credential Offer, attēlots kā QR kods
- Akreditācijas datu izdevējs uz Maks: tx_code, nosūtīts autoparka vadītāja tālrunim ar īsziņu
- Maks uz Akreditācijas datu izdevējs: GET /.well-known/openid-credential-issuer
- Akreditācijas datu izdevējs uz Maks: akreditācijas datu izdevēja metadati
- Maks uz Autorizācijas serveris: GET /.well-known/oauth-authorization-server
- Autorizācijas serveris uz Maks: autorizācijas servera metadati
- Maks uz Autorizācijas serveris: POST /token: pre-authorized_code, tx_code
- Autorizācijas serveris uz Maks: access_token
- Maks uz Akreditācijas datu izdevējs: POST /nonce
- Akreditācijas datu izdevējs uz Maks: c_nonce
- Maks: paraksta proof JWT
- Maks uz Akreditācijas datu izdevējs: POST /credential: piekļuves marķieris, pierādījumi
- Akreditācijas datu izdevējs uz Maks: credentials, notification_id
- Maks: pārbauda un saglabā
- Maks uz Akreditācijas datu izdevējs: POST /notify: credential_accepted
- Akreditācijas datu izdevējs uz Maks: 204 No Content
Kad akreditācijas dati vēl nav gatavi: atliktā izsniegšana
Iepriekšējais piemērs pieņem, ka apskates rezultāts jau ir galīgs. Ja apskates iestādei tā vietā ir jāeskalē robežgadījuma rezultāts vecākajam inspektoram, akreditācijas datu galapunkts nevar uzreiz atgriezt akreditācijas datus, tāpēc tas atliek izsniegšanu.
Tūlītēja izsniegšana
Akreditācijas datu galapunkts atgriež parakstītos akreditācijas datus tajā pašā atbildē, kurā tika saņemts pieprasījums.
Atlikta izsniegšana
Akreditācijas datu galapunkts atbild ar HTTP 202, transaction_id un intervālu. Maks aptaujā atlikto akreditācijas datu galapunktu ar šo identifikatoru, gaidot vismaz interval sekundes starp pieprasījumiem, līdz akreditācijas dati ir gatavi.
Atliktā atbilde no /credential
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"transaction_id": "fi-tx-55c2",
"interval": 900
}/deferred aptaujāšana, līdz tas ir gatavs
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.Cikla noslēgšana: paziņojumu galapunkts
Pēc izsniegšanas maks var informēt izdevēju, kas notika ar akreditācijas datiem, izmantojot notification_id no akreditācijas datu atbildes. Makiem nav pienākuma sūtīt šos paziņojumus, un piegāde nav garantēta, tāpēc izdevējs nedrīkst trūkstošu paziņojumu interpretēt kā jebko.
Maks
Nosūta notikumu uz izdevēja notification_endpoint saņemtajam notification_id, kas attiecas uz visiem akreditācijas datiem šajā atbildē
Saglabāts makā
Izsniegšana neizdevās kāda cita iemesla dēļ, piemēram, akreditācijas dati neizturēja pārbaudi
Izsniegšana neizdevās turētāja dēļ, piemēram, viņš atteicās to saglabāt
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"
}Saistītie termini
Biežāk uzdotie jautājumi
Kā maks zina, kuru piešķīruma veidu izmantot?
Credential Offer norāda piešķīrumu savā grants objektā. authorization_code ir klāt, ja izdevējs vēlas, lai turētājs pieteiktos kā daļu no procesa. pre-authorized_code ir klāt, ja turētājs jau ir autentificēts kanālā, kurā piedāvājums tika izveidots, piemēram, inspektora veikts apskates vietā tālāk izstrādātajā piemērā. Piedāvājums var uzskaitīt abus, un tad maks izvēlas vienu. Ja piedāvājumam vispār nav grants objekta, maks pārbauda, kurus piešķīruma veidus autorizācijas serveris atbalsta savos metadatos.
Kāpēc maks iegūst izdevēja metadatus, pirms kaut ko pieprasa?
Credential Offer norāda tikai credential_configuration_ids, izdevēja URL un grants. Izdevēja metadati, kas tiek nodrošināti no zināma ceļa, apraksta katru konfigurāciju: tās formātu, apgalvojumus un pieņemtos pierādījumu veidus, kā arī nonce, akreditācijas datu, atliktās izsniegšanas un paziņojumu galapunktus. Tie arī norāda, kuru autorizācijas serveri izmantot, un šī servera metadati sniedz marķiera galapunktu. Bez abiem maks nezinātu, kā izveidot derīgus pieprasījumus vai ko rādīt turētājam, pirms viņš dod piekrišanu.
Ko patiesībā pierāda turējuma pierādījums?
Tas pierāda, ka maks, kas pieprasa akreditācijas datus, tur privāto atslēgu, kurai akreditācijas dati tiks piesaistīti, nevis tikai to, ka tam ir derīgs piekļuves marķieris. Maks paraksta proof JWT pār izdevēja identifikatoru un svaigu c_nonce no izdevēja nonce galapunkta, izmantojot šo atslēgu. Izdevējs iegulda atbilstošo publisko atslēgu akreditācijas datos. Verificētājs, kas pieprasa atslēgas piesaisti, lūdz turētājam parakstīt vēlreiz ar to pašu atslēgu uzrādīšanas brīdī, tāpēc kopēti akreditācijas dati bez atslēgas šo pārbaudi neiztur.
Kāpēc izdevējs atliktu izsniegšanu, nevis uzreiz atgrieztu akreditācijas datus?
Dažas pārbaudes, ko izdevējs veic pirms akreditācijas datu izveides, nevar pabeigt viena HTTP pieprasījuma ietvaros, piemēram, manuālu pārskatīšanu vai zvanu lēnam ārējam reģistram. Atliktā izsniegšana ļauj akreditācijas datu galapunktam nekavējoties atbildēt ar transaction_id, nevis bloķēt savienojumu, un maks ar šo identifikatoru aptaujā atlikto galapunktu, līdz pārbaude ir pabeigta un akreditācijas dati ir gatavi saņemšanai.
Vai paziņojumu galapunkts izdevējam ir obligāts?
Nē. Izdevējiem tas ir izvēles, un arī makiem nav pienākuma to izmantot. Ja abi to atbalsta, izdevējs uzzina, kas notika pēc izsniegšanas: akreditācijas dati tika saglabāti (credential_accepted), turētājs pārtrauca izsniegšanu, piemēram, atsakoties tos saglabāt (credential_deleted), vai izsniegšana neizdevās cita iemesla dēļ (credential_failure). Piegāde nav garantēta, tāpēc izdevējam paziņojums jāuzskata par noderīgu informāciju, nevis par uzticamu ierakstu, un tas nedrīkst neko secināt no trūkstoša paziņojuma.
Avoti
Šī lapa ir informatīva un nav uzskatāma par juridisku konsultāciju. Autoritatīvu norādījumu saņemšanai vērsieties tieši pie OpenID Foundation un Eiropas Komisijas.