Compte tenu de ce contexte historique et de certaines normes, comment pouvons-nous traiter le JWT ci-dessus et quelles informations contient-il ?
Le JWT ci-dessus se compose de trois parties, séparées chacune par un point (« . ») :
- En-tête : eyJhbGciOiJIUzI1 NiIsInR5cCI6IkpXVCJ9
- Charge utile : eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
- Signature : _iVbBcypdse-9sjrxp9iOrGsXKBWrBB3mrHgBtukcfM
L’en-tête et la charge utile sont tous deux encodés en base64url et, sans tenir compte d’un éventuel remplissage, peuvent être décodés comme suit :
henrik@home> base64 -d <<< eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{"alg":"HS256","typ":"JWT"}
henrik@home> base64 -d <<< eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
{"sub":"1234567890ABC","name":"Henrik Loeser","iat":1611140400,"exp":1611234567}base64: invalid input
L’en-tête contient des informations sur l’algorithme utilisé (« alg »), ici HS256 (HMAC SHA256). La charge utile dépend du type de token (accès, actualisation, identification/…) et est composée de claims. Ces champs et d’autres champs d’en-tête et de charge utile JOSE prédéfinis sont gérés par l’IANA. Dans l’exemple ci-dessus, les champs et les claims sont « sub » (objet), « name » (nom), « iat » (émis à) et « exp » (délai d’expiration).
La signature est calculée en appliquant l'algorithme indiqué à la concaténation de l'en-tête, du « . » et de la charge utile, puis en encodant le résultat en base64url. Par la suite, les trois parties séparées par un point constituent le JWT. Les détails sur la façon dont les signatures sont dérivées sont définis dans la RFC 7515.
Vous pouvez accéder au JWT ci-dessus dans ce débogueur en ligne sur JTW.io. D’abord, il affichera un message « Signature non valide ». Vous pouvez résoudre ce problème en remplaçant le secret par défaut affiché par !!!mon-très-long-secret-256-bits-!!!.