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
Ein leerer Wert oder kein JWT
häufigEin fehlender Header, den `to_s` zu `""` gemacht hat, ein Session-Cookie oder ein opakes Access Token aus OAuth, das nie ein JWT war.
Der Header Authorization wurde als Ganzes dekodiert
häufig`request.headers["Authorization"]` liefert `Bearer eyJ…`. Entferne das Schema vor dem Dekodieren.
Ein verschlüsseltes Token
selten`JWT.decode` unterstützt keine JWE-Tokens mit fünf Segmenten; sie müssen zuerst mit einer JWE-Bibliothek entschlüsselt werden.
So behebst du den Fehler
- 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")