Mensagem de erro
token is unverifiable: error while executing keyfunc: kid "2026-10" not found in key set
Também aparece como
- token is unverifiable: error while executing keyfunc
- token is unverifiable: no keyfunc was provided
O texto depois de “error while executing keyfunc:” é o que seu Keyfunc retornou. Chamar `jwt.Parse` com um Keyfunc nil gera “token is unverifiable: no keyfunc was provided”.
golang-jwt/jwt (Go) — jwt.ErrTokenUnverifiable wrapping the error your Keyfunc returned
O que significa
O golang-jwt não conseguiu obter uma chave para verificar o token: seu `Keyfunc` retornou um erro, e o golang-jwt o encapsulou como `ErrTokenUnverifiable` (“error while executing keyfunc: …”). Tudo o que vem depois desse prefixo é a mensagem do seu próprio Keyfunc — na reprodução, uma busca de chave pelo `kid` que não encontrou nada. O token não foi verificado nem rejeitado com base no próprio conteúdo.
Por que acontece
O token indica uma chave que o serviço não tem
comumChaves carregadas uma única vez na inicialização ficam desatualizadas depois que o emissor faz a rotação das chaves. Um `kid` de outro ambiente ou de outro emissor produz a mesma falha na busca.
Não foi possível obter o conjunto de chaves
comumKeyfuncs que baixam o JWKS sob demanda retornam erros de rede (DNS, TLS, tempos limite, HTTP 404) por esse caminho. A mensagem encapsulada indica a falha real.
Nenhum Keyfunc foi passado
ocasional`jwt.Parse(token, nil)` ou uma variável de Keyfunc que nunca foi inicializada. Sem uma fonte de chaves, o golang-jwt não consegue verificar nada.
Como corrigir
- 1.
Usar um Keyfunc de JWKS que se atualiza
Um Keyfunc baseado em JWKS atualiza as chaves em segundo plano e sempre que aparece um `kid` desconhecido, de modo que as rotações não causam interrupções.
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 no log a causa encapsulada
`errors.Is(err, jwt.ErrTokenUnverifiable)` identifica a classe do erro; o erro encapsulado diz se foi uma chave não encontrada na busca ou uma falha ao baixar as chaves.
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)) }