JWT.encode et JWT.decode couvrent HS, RS, PS et ES en 256/384/512 ainsi qu’ES256K, en s’appuyant sur la gem openssl de Ruby. EdDSA ne fait plus partie de la gem jwt : avec seulement jwt 3.3.0 chargé, l’encodage EdDSA a échoué avec Unsupported signing method, et il a fonctionné après l’ajout de jwt-eddsa, dont la dépendance native ed25519 exige un compilateur C à l’installation, ce qui manque aux images de conteneur allégées.
La vérification exige de nommer l’algorithme : JWT.decode(token, key, true) sans algorithm: a échoué avec Expected a different algorithm. Les jetons non signés sont refusés à la vérification et ne se lisent qu’en désactivant celle-ci (JWT.decode(token, nil, false)), ce qu’un code ne devrait jamais faire pour des jetons auxquels il se fie. Les types de clés sont contrôlés : un jeton HS256 forgé avec le texte PEM de la clé EC a échoué avec HMAC key expected to be a String quand la clé de vérification était l’objet clé EC, mais il a été vérifié quand la chaîne PEM était passée comme clé HS256 ; conservez donc les clés sous forme d’objets OpenSSL::PKey. ES256 refuse une clé P-384 au moment de la signature.
Les contrôles de claims sont optionnels : aucune marge de tolérance, et exp est facultatif s’il n’est pas listé dans required_claims, où l’exemple le place avec l’émetteur. Les secrets HMAC de toute longueur sont acceptés (une clé de 5 octets a signé et vérifié sans avertissement) : vérifiez donc vos secrets avec le vérificateur de secrets JWT.
Les signatures ES256 font 64 octets en r‖s brut ; une signature DER échoue avec Signature verification failed. Collez un jeton dans le débogueur JWT pour voir quel encodage il contient.