github.com/go-jose/go-jose/v4 (la continuación del go-jose de Square) implementa JWS, JWE, JWK y JWT, y por eso aparece allí donde los servicios Go intercambian tokens cifrados o firmados. Con la 4.1.6 se firmó y se verificó con las familias HS, RS, PS y ES y con EdDSA; ES256K, Ed25519 y Ed448 no son nombres de algoritmo reconocidos.
La versión 4 hizo obligatoria la lista de algoritmos: jwt.ParseSigned(token, nil) falla con no signature algorithms specified, de modo que un token solo se puede analizar con los algoritmos que tú elijas. Los tokens sin firmar se pueden analizar si none está en esa lista, pero Claims(key) nunca los verifica: la única forma de leer uno es UnsafeClaimsWithoutVerification, cuyo nombre lo advierte expresamente.
La verificación está dividida en dos, y ahí está la trampa. token.Claims(key, &claims) comprueba la firma y rellena la estructura: devolvió sin ningún error los claims de un token que había caducado una hora antes. La caducidad, el inicio de validez, el emisor y la audiencia solo los comprueba claims.Validate() con un valor jwt.Expected o ValidateWithLeeway, y un token sin exp supera incluso eso, así que comprueba que Expiry esté establecido, como hace el ejemplo. Validate admite jwt.DefaultLeeway, un minuto, como confirmó la comprobación.
Las claves tienen tipo. Un token HS256 que usaba como clave el texto PEM falló contra la *ecdsa.PublicKey con error in cryptographic primitive, pero se verificó cuando se pasaron como clave esos mismos bytes PEM: guarda las claves como claves Go ya analizadas, no como bytes. ES256 rechaza una clave P-384 con expected 256 bit key, got 384 bits instead. Una firma ES256 codificada en DER falla con el mismo error in cryptographic primitive genérico que una falsificación; el decodificador de JWT muestra la longitud de la firma.
Para los tokens cifrados, el inspector de JWE muestra el encabezado y los algoritmos; para los conjuntos de claves, el comprobador de JWKS muestra lo que publica un proveedor y el conversor de JWK convierte claves entre JWK y PEM.