github.com/go-jose/go-jose/v4 (la suite du go-jose de Square) implémente JWS, JWE, JWK et JWT, ce qui explique sa présence partout où des services Go échangent des jetons chiffrés ou signés. La 4.1.6 a signé et vérifié les familles HS, RS, PS et ES ainsi qu’EdDSA ; ES256K, Ed25519 et Ed448 ne sont pas des noms d’algorithme reconnus.
La version 4 a rendu la liste d’algorithmes obligatoire : jwt.ParseSigned(token, nil) échoue avec no signature algorithms specified, si bien qu’un jeton ne peut être analysé qu’avec des algorithmes que vous avez choisis. Les jetons non signés peuvent être analysés si none figure dans cette liste, mais ils ne passent jamais la vérification de Claims(key) : la seule façon d’en lire un est la méthode au nom explicite UnsafeClaimsWithoutVerification.
La vérification est scindée en deux, et c’est là le piège. token.Claims(key, &claims) vérifie la signature et remplit la structure : cet appel a renvoyé sans aucune erreur les claims d’un jeton expiré depuis une heure. L’expiration, la date de début de validité, l’émetteur et l’audience ne sont contrôlés que par claims.Validate() avec une valeur jwt.Expected ou par ValidateWithLeeway, et un jeton sans exp passe même ce contrôle : vérifiez donc que Expiry est renseigné, comme le fait l’exemple. Validate tolère jwt.DefaultLeeway, soit une minute, ce que les essais ont confirmé.
Les clés sont typées. Un jeton HS256 dont la clé HMAC était le texte PEM a échoué face à la clé *ecdsa.PublicKey avec error in cryptographic primitive, mais a été vérifié quand ces mêmes octets PEM étaient passés comme clé : conservez les clés sous forme de clés Go analysées, pas d’octets. ES256 refuse une clé P-384 avec expected 256 bit key, got 384 bits instead. Une signature ES256 encodée en DER échoue avec le même error in cryptographic primitive générique qu’une signature falsifiée ; le débogueur JWT affiche la longueur de la signature.
Pour les jetons chiffrés, l’inspecteur JWE affiche l’en-tête et les algorithmes ; pour les jeux de clés, le vérificateur JWKS montre ce que publie un fournisseur et le convertisseur JWK fait passer les clés de JWK à PEM et inversement.