Mensaje de error
token is unverifiable: error while executing keyfunc: kid "2026-10" not found in key set
También se muestra como
- token is unverifiable: error while executing keyfunc
- token is unverifiable: no keyfunc was provided
El texto que sigue a «error while executing keyfunc:» es lo que devuelve tu Keyfunc. Llamar a `jwt.Parse` con una Keyfunc nil da «token is unverifiable: no keyfunc was provided».
golang-jwt/jwt (Go) — jwt.ErrTokenUnverifiable wrapping the error your Keyfunc returned
Qué significa
golang-jwt no puede obtener una clave para verificar el token: tu `Keyfunc` devuelve un error, y golang-jwt lo envuelve como `ErrTokenUnverifiable` («error while executing keyfunc: …»). Todo lo que sigue a ese prefijo es el mensaje de tu propia Keyfunc; en la reproducción, una búsqueda de clave por `kid` que no encontró nada. El token no se ha verificado ni rechazado por sus propios méritos.
Por qué ocurre
El token nombra una clave que el servicio no tiene
frecuenteLas claves cargadas una sola vez al arrancar se quedan obsoletas cuando el emisor rota sus claves. Un `kid` de otro entorno o de otro emisor produce el mismo fallo de búsqueda.
No se puede obtener el conjunto de claves
frecuenteLas Keyfunc que descargan el JWKS bajo demanda devuelven por esta vía los errores de red (DNS, TLS, tiempos de espera, HTTP 404). El mensaje envuelto nombra el fallo real.
No se pasa ninguna Keyfunc
ocasional`jwt.Parse(token, nil)` o una variable Keyfunc que nunca se inicializó. golang-jwt no puede verificar nada sin una fuente de claves.
Cómo solucionarlo
- 1.
Usar una Keyfunc de JWKS que se actualice sola
Una Keyfunc respaldada por un JWKS actualiza las claves en segundo plano y cuando aparece un `kid` desconocido, así que las rotaciones no provocan caídas del servicio.
go k, err := keyfunc.NewDefaultCtx(ctx, []string{"https://issuer.example.com/.well-known/jwks.json"}) if err != nil { log.Fatalf("load JWKS: %v", err) } // Refetches the JWKS in the background and on unknown kids (rate-limited). token, err := jwt.Parse(raw, k.Keyfunc, jwt.WithValidMethods([]string{"ES256"})) - 2.
Registrar la causa envuelta
`errors.Is(err, jwt.ErrTokenUnverifiable)` identifica la clase; el error envuelto te dice si fue una clave no encontrada o un fallo de descarga.
go if errors.Is(err, jwt.ErrTokenUnverifiable) { // The wrapped error is whatever your Keyfunc returned: log it, answer 401. log.Printf("cannot verify token: %v", errors.Unwrap(err)) }