Mensagem de erro
Expected 200 OK from the JSON Web Key Set HTTP response
jose (JavaScript) — JOSEError from createRemoteJWKSet, code ERR_JOSE_GENERIC
O que significa
O `createRemoteJWKSet` requisitou a URL do conjunto de chaves e recebeu um status HTTP diferente de 200. O jose busca o JWKS com redirecionamentos desativados (`redirect: "manual"`), então um 301/302 conta como falha, assim como um 404 ou 401. Nenhuma chave foi carregada e nenhuma assinatura de token foi verificada; a URL que você configurou não responde com um conjunto de chaves.
Por que acontece
A URL configurada não é o jwks_uri
comumCada provedor usa o próprio caminho: 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`. Apontar o jose para a URL do emissor ou para o próprio documento de descoberta retorna 404 ou uma resposta que não é um JWKS.
O endpoint responde com um redirecionamento
comumRedirecionamentos de HTTP para HTTPS, um redirecionamento por barra final ou uma CDN que mudou o arquivo de lugar respondem todos com 30x. Navegadores e o curl seguem esses redirecionamentos sem avisar; o jose não, então a URL precisa ser a final.
O conjunto de chaves está atrás de autenticação ou de uma política de rede
ocasionalProvedores de identidade internos às vezes ficam atrás de um gateway de API que exige credenciais (401/403), ou um proxy de saída responde com a própria página de erro. Um JWKS é um dado público e deveria estar acessível sem credenciais para todos os verificadores.
Buscas demais
raraUm verificador que cria um novo objeto de JWKS remoto a cada requisição busca o conjunto de novo toda vez e pode ser limitado (429). Crie o objeto uma vez e reutilize-o para que o cache dele funcione.
Como corrigir
- 1.
Ler o jwks_uri do documento de descoberta
Provedores OpenID Connect publicam a URL exata do conjunto de chaves como `jwks_uri` em `/.well-known/openid-configuration`. Obtenha essa URL uma vez na inicialização e passe-a para o `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.
Verificar o código de status sem seguir redirecionamentos
O curl sem `-L` se comporta como o jose. Um 200 com `{"keys":[...]}` é o que você precisa; um 30x informa a URL que deve ser configurada no 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