Développeur 🔒 Fonctionne dans votre navigateur — aucune donnée envoyée

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.

Jeton JWT
Secret ou clé publique
La clé est utilisée dans votre navigateur et n’est envoyée nulle part.
Décodé
En-tête

          
        
Charge utile

        
Signature

Signez votre propre jeton pour tester un point d’accès. Tout est calculé dans cette page.

Clé de signature

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é.

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 iciCorrection
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 audienceaud nomme une autre APIDemandez le jeton pour l’audience attendue par l’API
Mauvais émetteuriss est l’URL de préproduction, pas celle de productionPointez le client sur le bon émetteur, ou l’API sur le sien
Mauvaise cléVérifier annonce que la signature ne correspond pasPrenez la clé avec laquelle l’émetteur a signé ; attention aux secrets en Base64
Mauvais algorithmeL’en-tête indique ES256 et votre clé est une clé RSAAccordez la clé à l’algorithme affiché à côté du champ de clé
Ce n’est pas un JWSLa page le nomme JWE, avec cinq partiesLa 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 Bearer copié 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 kid qui 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.

Guides associés