Message d’erreur
Expected a different algorithm (JWT::IncorrectAlgorithm)
Également affiché sous la forme
- JWT::IncorrectAlgorithm: Expected a different algorithm
ruby-jwt (Ruby) — JWT::IncorrectAlgorithm from JWT.decode
Ce que cela signifie
L’en-tête `alg` du jeton ne figure pas parmi les algorithmes que vous avez autorisés – et si vous n’avez passé aucune option `algorithm:`/`algorithms:`, ruby-jwt n’en autorise aucun. Depuis ruby-jwt 2.x, le vérificateur doit nommer explicitement l’algorithme, car faire confiance à l’en-tête du jeton lui-même est à l’origine des attaques bien connues par confusion d’algorithme. La signature n’a pas été vérifiée.
Pourquoi cela se produit
Aucun algorithme passé à JWT.decode
fréquenteLe code tiré des tutoriels de ruby-jwt 1.x appelle `JWT.decode(token, key, true)`. Dans ce cas, les versions actuelles rejettent chaque jeton avec cette erreur.
L’émetteur utilise un autre algorithme que celui configuré
fréquenteUne migration de RS256 vers ES256 (ou de HS256 vers un algorithme asymétrique) côté émetteur casse les vérificateurs qui figent encore l’ancienne valeur.
Un jeton d’un autre émetteur, ou un sondage
occasionnelleLes jetons avec `alg: none` ou `HS256` envoyés à une API qui vérifie en RS256/ES256 sont rejetés ici, comme il se doit.
Comment corriger l’erreur
- 1.
Nommer explicitement l’algorithme de l’émetteur
Passez `algorithm:` (ou `algorithms:` pour une courte liste). Avec plusieurs algorithmes, utilisez un chargeur JWKS pour que chaque jeton soit vérifié avec une clé du type correspondant.
ruby payload, header = JWT.decode(token, public_key, true, algorithm: "ES256") # several allowed algorithms (e.g. during a migration), each matched to the right key type: payload, header = JWT.decode(token, nil, true, algorithms: ["ES256", "RS256"], jwks: jwks_loader)