Mensaje de error
Expected 200 OK from the JSON Web Key Set HTTP response
jose (JavaScript) — JOSEError from createRemoteJWKSet, code ERR_JOSE_GENERIC
Qué significa
`createRemoteJWKSet` solicitó la URL del conjunto de claves y recibió un estado HTTP distinto de 200. jose obtiene el JWKS con las redirecciones desactivadas (`redirect: "manual"`), así que un 301/302 cuenta como fallo igual que un 404 o un 401. No se cargó ninguna clave ni se comprobó la firma de ningún token; la URL configurada no responde con un conjunto de claves.
Por qué ocurre
La URL configurada no es el jwks_uri
frecuenteCada proveedor usa su propia ruta: Auth0 `/.well-known/jwks.json`, Keycloak `/realms/<realm>/protocol/openid-connect/certs`, Entra ID `/<tenant>/discovery/v2.0/keys`, Google `https://www.googleapis.com/oauth2/v3/certs`. Apuntar jose a la URL del emisor o al propio documento de descubrimiento devuelve un 404 o una respuesta que no es un JWKS.
El endpoint responde con una redirección
frecuenteLas redirecciones de HTTP a HTTPS, una redirección por la barra final o una CDN que movió el archivo responden todas con 30x. Los navegadores y curl las siguen sin avisar; jose no, así que la URL tiene que ser la final.
El conjunto de claves está detrás de una autenticación o de una política de red
ocasionalLos proveedores de identidad internos a veces están detrás de una pasarela de API que exige credenciales (401/403), o un proxy de salida responde con su propia página de error. Un JWKS son datos públicos y debería ser accesible sin credenciales desde todos los verificadores.
Demasiadas solicitudes
raraUn verificador que crea un nuevo objeto JWKS remoto en cada solicitud vuelve a descargar el conjunto cada vez y puede verse limitado (429). Crea el objeto una vez y reutilízalo para que funcione su caché.
Cómo solucionarlo
- 1.
Leer jwks_uri del documento de descubrimiento
Los proveedores de OpenID Connect publican la URL exacta del conjunto de claves como `jwks_uri` en `/.well-known/openid-configuration`. Resuélvela una vez al arrancar y pasa esa URL a `createRemoteJWKSet`.
js import { createRemoteJWKSet } from "jose"; // Resolve jwks_uri from the provider's discovery document instead of guessing it. const discovery = await fetch("https://login.example.com/.well-known/openid-configuration").then((r) => r.json()); const jwks = createRemoteJWKSet(new URL(discovery.jwks_uri)); - 2.
Comprobar el código de estado sin seguir las redirecciones
curl sin `-L` se comporta como jose. Lo que necesitas es un 200 con `{"keys":[...]}`; un 30x te indica la URL que debes configurar en su lugar.
bash # Status line and redirect target, without following redirects (jose does not follow them either) curl -sS -o /dev/null -w '%{http_code} %{redirect_url}\n' https://login.example.com/jwks curl -s https://login.example.com/.well-known/openid-configuration | jq -r .jwks_uri