Message d’erreur
Not enough or too many segments
Également affiché sous la forme
- Not enough or too many segments (JWT::DecodeError)
- Invalid base64 encoding (JWT::Base64DecodeError)
ruby-jwt 2.x levait `JWT::DecodeError` avec le même texte. Le cas du préfixe `Bearer` donne « Invalid base64 encoding (JWT::Base64DecodeError) ».
ruby-jwt (Ruby) — JWT::DecodeError (JWT::MalformedTokenError in 3.x) from JWT.decode
Ce que cela signifie
ruby-jwt a découpé l’entrée sur les points sans trouver les trois segments d’un JWT signé : rien d’autre n’a donc été vérifié. Dans ruby-jwt 3.x, la classe est `JWT::MalformedTokenError` (une `JWT::TokenError`, elle-même une `JWT::DecodeError`) : les blocs `rescue JWT::DecodeError` existants l’interceptent donc toujours. Un jeton qui porte encore son préfixe `Bearer ` se découpe bien en trois parties, mais échoue alors dès la première avec « Invalid base64 encoding ».
Pourquoi cela se produit
Une valeur vide ou qui n’est pas un JWT
fréquenteUn en-tête absent transformé en `""` par `to_s`, un cookie de session ou un jeton d’accès OAuth opaque qui n’a jamais été un JWT.
L’en-tête Authorization a été décodé en entier
fréquente`request.headers["Authorization"]` renvoie `Bearer eyJ…`. Retirez le schéma avant le décodage.
Un jeton chiffré
rare`JWT.decode` ne prend pas en charge les jetons JWE à cinq segments ; ils doivent d’abord être déchiffrés avec une bibliothèque JWE.
Comment corriger l’erreur
- 1.
Extraire le jeton et vérifier sa forme au préalable
N’acceptez que `Bearer <header.payload.signature>` et répondez 401 pour tout le reste, avant que ruby-jwt ne voie la valeur.
ruby def bearer_token(request) scheme, token = request.authorization.to_s.split(" ", 2) return nil unless scheme&.casecmp?("Bearer") && token&.count(".") == 2 token end token = bearer_token(request) or return head(:unauthorized) payload, _header = JWT.decode(token, public_key, true, algorithm: "ES256")