JWT.encode und JWT.decode decken HS, RS, PS und ES bei 256/384/512 sowie ES256K ab, aufgebaut auf dem openssl-Gem von Ruby. EdDSA gehört nicht mehr zum Gem jwt: Wenn nur jwt 3.3.0 geladen war, scheiterte das Kodieren mit EdDSA mit Unsupported signing method; es funktionierte erst nach dem Hinzufügen von jwt-eddsa – einem Gem, dessen native Abhängigkeit ed25519 bei der Installation einen C-Compiler braucht, der in schlanken Container-Images fehlt.
Die Prüfung verlangt, dass du den Algorithmus nennst: JWT.decode(token, key, true) ohne algorithm: scheiterte mit Expected a different algorithm. Unsignierte Tokens werden bei der Prüfung abgelehnt und lassen sich nur mit abgeschalteter Prüfung lesen (JWT.decode(token, nil, false)), was Code bei Tokens, denen er vertraut, nie tun sollte. Schlüsseltypen werden geprüft: Ein HS256-Token, das mit dem PEM-Text des EC-Schlüssels gefälscht wurde, scheiterte mit HMAC key expected to be a String, wenn der Prüfschlüssel das EC-Schlüsselobjekt war – wurde dagegen der PEM-String als HS256-Schlüssel übergeben, bestand es die Prüfung; verwende Schlüssel daher als Objekte vom Typ OpenSSL::PKey. ES256 lehnt einen P-384-Schlüssel schon beim Signieren ab.
Claim-Prüfungen musst du selbst aktivieren: keine Toleranz (Leeway), und exp ist optional, sofern der Claim nicht in required_claims steht – so macht es das Beispiel, zusammen mit dem Aussteller. HMAC-Secrets jeder Länge werden akzeptiert – mit einem 5-Byte-Schlüssel funktionierten Signieren und Prüfen ohne Warnung –, prüfe Secrets daher mit dem JWT-Secret-Checker.
ES256-Signaturen bestehen aus 64 Byte rohem r‖s; eine DER-Signatur scheitert mit Signature verification failed. Füge ein Token in den JWT-Debugger ein, um zu sehen, welche Kodierung es enthält.