Voor de implementatie van de autorisatie- en authenticatielaag in een gedistribueerde architectuur worden doorgaans systemen voor gecentraliseerd identiteitsbeheer gebruikt, zoals OAuth 2.0, OpenID Connect of bedrijfs-Identity Providers (IdP). Authenticatie (identiteitsvaststelling) gebeurt via een externe provider, waarna het resultaat (meestal een token) wordt gebruikt voor autorisatie (toekennen van permissies) in alle services.
Gewoonlijk werkt het schema als volgt:
Voorbeeld van code voor het controleren van een JWT-token in Python met de PyJWT-library:
import jwt from jwt.exceptions import InvalidTokenError def verify_jwt(token, public_key): try: payload = jwt.decode(token, public_key, algorithms=["RS256"]) return payload except InvalidTokenError: return None # voorbeeld gebruik user_info = verify_jwt(received_token, public_key) if user_info: # toegang toegestaan pass else: # toegang geweigerd pass
Belangrijke kenmerken:
Vraag: Is het noodzakelijk om alle informatie over gebruikersrechten direct binnen de JWT-token op te slaan?
Niet noodzakelijk. Om de grootte van de token te minimaliseren, worden doorgaans alleen de gebruikers-id en een minimale set van rechten/rollen opgenomen. Gedetailleerde permissies kunnen op aanvraag van de server worden verkregen via extra verzoeken of geladen profile claims.
Vraag: Zijn refresh-tokens een essentieel element van alle gedistribueerde architecturen?
Nee, refresh-tokens zijn alleen nodig als een langdurige sessie zonder herauthenticatie vereist is. In stateless API’s vallen vaak alleen access tokens van korte duur onder de regels, terwijl refresh-logica alleen voor web- of mobiele clients wordt geïmplementeerd.
Vraag: Kan de payload-sectie in een JWT worden versleuteld?
Volgens de JWT-standaard (RFC 7519) wordt de payload alleen ondertekend, maar niet versleuteld. Voor versleuteling wordt een andere standaard gebruikt — JWE (JSON Web Encryption). Anders kan iedereen die de token heeft de payload lezen (bijvoorbeeld via jwt.io):
import jwt jwt.decode(token, options={"verify_signature": False})