Preskoči na glavni sadržaj

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.

Ponuda kreirana
QR kod ili poveznica otvara novčanik
Ponuda primljena
odobrenje iskorišteno
Token dobiven
nonce i dokaz posjedovanja
Vjerodajnica zatražena
vjerodajnica izdana
Vjerodajnica izdana
novčanik provjerava i pohranjuje
Vjerodajnica prihvaćena
Gdje može doći do neuspjeha, redoslijedom koraka:
Kod istekao prije iskorištavanja
Zahtjev za token odbijen
Zahtjev za vjerodajnicu odbijen
Vjerodajnica nije pohranjena

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-a
  • alg: algoritam potpisivanja, jedan od onih koje je izdavatelj naveo u proof_signing_alg_values_supported
  • jwk: 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 izdavatelja
  • iat: 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

  1. Izdavatelj vjerodajnica prema Novčanik: Credential Offer, prikazana kao QR kod
  2. Izdavatelj vjerodajnica prema Novčanik: tx_code, poslan voditelju flote SMS porukom na telefon
  3. Novčanik prema Izdavatelj vjerodajnica: GET /.well-known/openid-credential-issuer
  4. Izdavatelj vjerodajnica prema Novčanik: metapodaci izdavatelja vjerodajnica
  5. Novčanik prema Poslužitelj za autorizaciju: GET /.well-known/oauth-authorization-server
  6. Poslužitelj za autorizaciju prema Novčanik: metapodaci poslužitelja za autorizaciju
  7. Novčanik prema Poslužitelj za autorizaciju: POST /token: pre-authorized_code, tx_code
  8. Poslužitelj za autorizaciju prema Novčanik: access_token
  9. Novčanik prema Izdavatelj vjerodajnica: POST /nonce
  10. Izdavatelj vjerodajnica prema Novčanik: c_nonce
  11. Novčanik: potpisuje proof JWT
  12. Novčanik prema Izdavatelj vjerodajnica: POST /credential: pristupni token, dokazi
  13. Izdavatelj vjerodajnica prema Novčanik: credentials, notification_id
  14. Novčanik: provjerava i pohranjuje
  15. Novčanik prema Izdavatelj vjerodajnica: POST /notify: credential_accepted
  16. 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.

transaction_idispitivanje deferred_credential_endpoint krajnje točke

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

credential_accepted

Pohranjeno u novčaniku

credential_failure

Izdavanje nije uspjelo iz nekog drugog razloga, na primjer vjerodajnica nije prošla provjeru valjanosti

credential_deleted

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

  1. OpenID for Verifiable Credential Issuance 1.0
  2. OpenID4VC High Assurance Interoperability Profile 1.0
  3. EUDI Wallet Architecture and Reference Framework

Ova stranica ima informativni karakter i ne predstavlja pravni savjet. Za mjerodavne smjernice obratite se izravno OpenID Foundationu i Europskoj komisiji.

Razgovarajte s nama o integraciji EUDI Wallet