OAuth 2.0: JWT token en claims
In mijn vorige blog heb ik uitgelegd hoe OAuth 2.0 ervoor kan zorgen dat derde partijen op een veilige manier gebruik kunnen maken van jouw applicatie met behulp van tokens. In deze blog gaan we wat meer inzoomen op specifieke functionaliteit van OAuth 2.
Zoals eerder besproken werkt OAuth 2.0 met een toegangstoken. Deze tokens hebben een JSON Web Token (JWT) format. Het JWT token bestaat uit 3 delen gescheiden door drie punten (.). Vaak ziet een token er ongeveer als volgt uit: xxxxx.yyyyy.zzzzz. De drie verschillende delen zijn als volgt:
- De header: bestaat vaak uit 2 onderdelen, het type token (vaak JWT) en het versleutel algoritme dat gebruikt is om het token te versleutelen, zoals HMAC SHA256.
- De payload: bevat informatie over de gebruiker van het token, zoals claims en permissies. Deze zijn voor iedereen inzichtelijk dus let erop dat je hier geen gevoelige informatie inzet. Ook is een JWT token erop gemaakt om kort en compact te zijn dus denk aan de lengte van de namen van de claims die je aan het token toevoegt.
- De signature: wordt gebruikt om te valideren dat het token vertrouwenswaardig en veilig is.
Het token bevat informatie over de gebruiker en het token zelf. Deze informatie wordt versleuteld met een sleutel welke bij de zender en de ontvanger bekend zijn. Hierdoor kunnen beide partijen nagaan of het token legitiem is.
Bovenstaande delen worden elk versleuteld door gebruik te maken van Base64Url encodering. Op de deze website kun je een token terugvertalen naar leesbare informatie en kun je precies zien uit welke 3 delen het token bestaat.
Doordat in de payload van het toegangstoken informatie staat over de claims en permissies van de gebruiker, kan de applicatie in het token uitlezen of een gebruiker wel recht heeft om een bepaald HTML endpoint aan te roepen.
Zo bevat een JWT token de volgende gereserveerde claims. Deze claims zijn optioneel:
Code | Naam | Omschrijving |
iss | Issuer | Naam van de uitgever van het token |
sub | Subject | De gebruiker van het token |
aud | Audience | De ontvangers voor wie het token is bedoeld |
exp | Expiration time | Geeft aan wanneer de geldigheid van het token verloopt |
nbf | Not before time | Voor deze tijd is het toegangstoken niet geldig |
iat | Issued at time | De uitgiftedatum van het token |
jti | JWT ID | Unieke waarde waarmee het token geïdentificeerd kan worden, wat ervoor zorgt dat het token eenmalig gebruikt kan worden (totdat de geldigheid verstrijkt) |
De volgende claims zijn te vinden in de header van het token:
Code | Naam | Omschrijving |
typ | Type | Het typen token, vaak JWT |
cty | Content type | Het wordt aangeraden hier ook JWT in te zetten |
alg | Algorithm | Het algoritme gebruikt om het token te versleutelen. |
Naast deze claims kan je zelf ook eigen claims toevoegen. Hier kun je publieke of privé claims toevoegen.
Publieke claims zijn voor iedereen zichtbaar en bevatten vaak generieke informatie, zoals een naam of e-mailadres. Let hier wel op de naamgeving, welke uniek moet zijn. Je kunt een publieke claim prefixen met bijvoorbeeld de naam van je applicatie.
Privé claims bevatten informatie die alleen geldt voor jouw applicatie, zoals bepaalde rollen voor een gebruiker. Ook hier geldt weer dat de naam uniek moet zijn en geen conflicten moet opleveren met bijvoorbeeld de gereserveerde claims.
Meer lezen over JWT tokens en claims?