Zum Inhalt springen
ecdsa.com
ruby-jwt (Ruby)Ruby

Fehlermeldung

Not enough or too many segments

Auch ausgegeben als

  • Not enough or too many segments (JWT::DecodeError)
  • Invalid base64 encoding (JWT::Base64DecodeError)

ruby-jwt 2.x hat mit demselben Text `JWT::DecodeError` ausgelöst. Im Fall mit dem Präfix `Bearer` lautet die Meldung „Invalid base64 encoding (JWT::Base64DecodeError)“.

ruby-jwt (Ruby) — JWT::DecodeError (JWT::MalformedTokenError in 3.x) from JWT.decode

Was der Fehler bedeutet

ruby-jwt hat die Eingabe an den Punkten aufgeteilt und nicht die drei Segmente eines signierten JWT gefunden, deshalb wurde nichts weiter geprüft. In ruby-jwt 3.x ist die Klasse `JWT::MalformedTokenError` (ein `JWT::TokenError`, der wiederum ein `JWT::DecodeError` ist), sodass bestehende Blöcke mit `rescue JWT::DecodeError` ihn weiterhin abfangen. Ein Token, das noch sein Präfix `Bearer ` trägt, zerfällt zwar in drei Teile, scheitert aber stattdessen schon am ersten mit „Invalid base64 encoding“.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Token zuerst extrahieren und seine Form prüfen

    Akzeptiere nur `Bearer <header.payload.signature>` und antworte auf alles andere mit 401, bevor ruby-jwt es zu sehen bekommt.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen