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]