Aller au contenu
ecdsa.com
ruby-jwt (Ruby)Ruby

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

Comment corriger l’erreur

  1. 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")

Erreurs associées

Parcourir toute la base de données des erreurs de signature