Formatering av DPoP-bevis
Dette dokumentet beskriver hvordan et DPoP-bevis skal sendes i forespørselen til henholdsvis HelseID og et API.
DPoP-headeren i HTTP-kallet
Et DPoP-bevis skal inkluderes i headeren med navn DPoP
i alle kall til token-endepunktet i HelseID og alle kall til API-er som benytter DPoP.
Navnet på headeren er DPoP
og innholdet er DPoP-beviset i base64-format:
DPoP eyJhbGciOiJSUzUxMiIsImtpZCI6IkI0Mjc3MjFFNUQxRTc3MDkyNzFDNkM2NzFCQzlFMDdCIiwidHlwIjoiZHBvcFx1MDAyQmp3dCIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoiMFZVTEpsSUduNFNNL...X0.eyJqdGkiOiJCMDUwQjYxNzA4RjQyOUU0MzNFQTY5QzJFNUE4RkQ0QiIsImh0bSI6IlBPU1QiLCJodHUiOiJodHRwczovL2hlbHNlaWQtc3RzLnRlc3QubmhuLm5vL2Nvbm5lY3QvdG9rZW4iLCJpYXQiOjE2OTI5NDY3MjcsIm5vbmNlIjoiIn0.DSIuBH8nYGuZDVbUggWT7S3iDjMCPR3aH5V9FNG5lmUF3V4rTgSC5YfmhcLFTaYFbeqZA1Ap6WzytlyE1-5kMlS0vWIgiFCViGQDzST-XVWYJQgLKL4Gfs8BXwZhNe2lPQibtjOShTKHRF_hsdSh2u...hSyjHBT4xL7ODGMoh-7c
Strukturen til et DPoP-bevis
Figuren under viser et gyldig DPoP-bevis i dekodet form. DPoP-beviset er en vanlig JWT som er signert med en privatnøkkel klienten besitter.
Strukturen til headeren
Headeren skal bestå av følgende claims: typ
, alg
og jwk
.
typ-claimet skal alltid ha verdien dpop+jwt
. Dette indikerer at JWT-en er et DPoP-bevis.
alg-claimet skal fortelle hvilken signeringsalgoritme som er brukt i denne JWT-en. Algoritmene må være en av de som finnes i dette dokumentet.
jwk-claimet skal inneholde den offentlige nøkkelen brukt for signering av DPoP-beviset og skal være en gyldig Json Web Key.
Strukturen til innholdet
Innholdet (body) til DPoP-beviset skal alltid inneholde følgende claims: jti
, htm
, htu
og iat
. Når et DPoP-bevis brukes mot HelseID, vil det også kunne inneholde claimet nonce
. Når et DPoP-bevis skal brukes i et API-kall, må det i tillegg inneholde claimet ath
.
jti-claimet skal være en verdi som unikt identifiserer denne JWT-en. HelseID vil avvise en forespørsel med en jti
som vi har sett tidligere.
htm-claimet og htu-claimet skal sammen identifisere url-en DPoP-beviset er ment å brukes mot. htm
forteller hvilken Http-metode som brukes, htu
forteller hvilken url som kalles. I eksempelet under gjør vi f.eks. en POST
mot token-endepunktet til HelseID sitt testmiljø.
iat-claimet er et Unix Timestamp som forteller når JWT-en ble opprettet. HelseID vil avvise et DPoP-bevis som er eldre enn 10 sekunder.
nonce-claimet brukes ved det andre kallet til HelseID. Nonce-verdien blir satt i headeren DPoP-Nonce
i responsen fra det første kallet til HelseID. Denne funksjonaliteten er beskrivet her.
ath-claimet skal bare brukes ved API-kall. Verdien skal være en SHA-256 hash av access-tokenet som blir brukt i authorize
-headeren sammen med DPoP-beviset.
Eksempel på et DPoP-bevis brukt mot token-endepunktet i HelseID (uten nonce-verdi):
{
"typ": "dpop+jwt",
"alg": "RS512",
"jwk": {
"kty": "RSA",
"n": "0VULJlIGn4SM-Y0ZTYOKSpr3KyCbVXK...mVIKTMrAvt72UphUFUkqEwM0Jat2ECuRbOC2VhhovPooYYHNRHvvpQ0",
"e": "AQAB",
"alg": "RS512"
}
}
.
{
"jti": "23525A88D27BF09EBED7EFF61A21577B",
"htm": "POST",
"htu": "https://helseid-sts.test.nhn.no/connect/token",
"iat": 1692772293
}
.
[Signature]
Eksempel på et DPoP-bevis mot et API; beviset inneholder et ath
-claim som er en hash av access-tokenet:
{
"typ": "dpop+jwt",
"alg": "RS512",
"jwk": {
"kty": "RSA",
"n": "0VULJlIGn4SM-Y0ZTYOKSpr3KyCbVXK...mVIKTMrAvt72UphUFUkqEwM0Jat2ECuRbOC2VhhovPooYYHNRHvvpQ0",
"e": "AQAB",
"alg": "RS512"
}
}
.
{
"jti": "B050B61708F429E433EA69C2E5A8FD4B",
"htm": "POST",
"htu": "https://eksempelapi.nhn.no/api",
"iat": 1692946727,
"ath":"fUHyO2r2Z3DZ53EsNrWBb0xWXoaNy59IiKCAqksmQEo"
}
.
[Signature]