Débogueur JWT
Un 401 avec un jeton qui semble correct vient presque toujours de l’une de six causes. Cette page vous montre le jeton tel que le serveur le lit, pour trouver laquelle.
Signez votre propre jeton pour tester un point d’accès. Tout est calculé dans cette page.
La clé et le jeton obtenu restent dans votre navigateur : rien n’est envoyé nulle part, et rien de tout cela ne figure dans un lien partagé.
Vérifiez ce jeton dans votre propre code. L’extrait suit l’algorithme indiqué dans l’en-tête.
Déboguer un JSON Web Token qui se fait refuser
Les jetons échouent d’un petit nombre de façons, et aucune n’est visible dans le jeton lui-même : trois blocs de Base64URL séparés par des points. Collez-le ici et il devient quelque chose de discutable : chaque champ d’en-tête et chaque claim, dans un tableau qui dit à quoi ils servent, l’expiration traduite en mots simples et la signature contrôlée avec la clé dont vous disposez.
Le décodage se fait au fil de la frappe, et rien n’est envoyé nulle part. Sur une page pareille, cela mérite d’être dit franchement, car ce que vous vous apprêtez à coller est un accès en fonctionnement au compte de quelqu’un.
Les six défaillances, dans l’ordre qui fait gagner du temps
| Ce qui a échoué | Comment cela se voit ici | Correction |
|---|---|---|
| Expiré | La ligne au-dessus de l’en-tête indique « Expiré… » | Renouvelez le jeton ; s’il n’y a que quelques secondes, regardez les horloges |
| Mauvaise audience | aud nomme une autre API | Demandez le jeton pour l’audience attendue par l’API |
| Mauvais émetteur | iss est l’URL de préproduction, pas celle de production | Pointez le client sur le bon émetteur, ou l’API sur le sien |
| Mauvaise clé | Vérifier annonce que la signature ne correspond pas | Prenez la clé avec laquelle l’émetteur a signé ; attention aux secrets en Base64 |
| Mauvais algorithme | L’en-tête indique ES256 et votre clé est une clé RSA | Accordez la clé à l’algorithme affiché à côté du champ de clé |
| Ce n’est pas un JWS | La page le nomme JWE, avec cinq parties | La charge utile est chiffrée ; lisez-la là où se trouve la clé de déchiffrement |
L’ordre compte. L’expiration et l’audience ne demandent ni clé ni l’aide de personne : quelques secondes suffisent à les écarter. Poursuivre un problème de signature qui se révèle être un aud mal choisi, en revanche, est le meilleur moyen de perdre un après-midi.
Lire n’est pas vérifier
C’est la distinction qui piège le plus de monde. Décoder vous dit ce qu’un jeton prétend ; cela ne dit rien de la véracité, puisque l’en-tête et la charge utile sont encodés, non chiffrés, et que n’importe qui peut écrire les siens. Vérifier consiste à recalculer la signature avec le secret ou la clé publique de l’émetteur — ce que cette page fait dans votre navigateur — et c’est la seule étape qui transforme une affirmation en fait.
Servez-vous donc de la vue décodée pour former une hypothèse, et du bouton Vérifier pour la tester ; et ne laissez jamais une décision d’autorisation, dans votre propre code, reposer sur du contenu décodé. C’est exactement pour cela que l’onglet Code affiche le contrôle côté serveur dans huit langages. Si c’est l’encodage lui-même qui vous intrigue, la différence entre Base64 et Base64URL explique pourquoi un segment de JWT ne se colle pas tel quel dans un décodeur Base64 ordinaire.
Ce qui ressemble à un problème de jeton et n’en est pas
- Le mot
Bearercopié avec le jeton, ou un retour à la ligne venu du terminal : les deux modifient l’entrée signée et cassent la signature. - Un jeton coupé par une visionneuse de journaux. Le segment de signature a une longueur fixe par algorithme, donc un jeton tronqué échoue à tous les coups.
- Deux services qui partagent un secret dont l’un le stocke en Base64. Cochez Le secret est en Base64 pour reproduire ce côté-là.
- Un
kidqui n’existe plus parce que l’émetteur a fait tourner ses clés ; le jeton va bien, c’est le jeu de clés qui est périmé.
Une fois le jeton mis hors de cause, les suspects restants sont côté serveur : un middleware qui ne valide jamais, une horloge qui dérive, un cache qui garde un ancien jeu de clés. Si vous avez besoin d’un jeton dans un état connu pour tester tout cela — expiré, valide, signé avec une clé à vous —, le générateur de JWT le fabrique, et le vérificateur d’expiration explique comment un vérificateur lit les claims de temps.