Mensagem de erro
token signature is invalid: signing method ES256 is invalid
Também aparece como
- signing method ES256 is invalid
- token signature is invalid: signing method HS256 is invalid
- token is unverifiable: signing method (alg) is unavailable
A v4 imprime “signing method ES256 is invalid”. Um valor de `alg` que o golang-jwt não conhece (ou `none` sem a constante especial) gera “token is unverifiable: signing method (alg) is unavailable” em vez disso.
golang-jwt/jwt (Go) — WithValidMethods rejected the token's alg
O que significa
O cabeçalho `alg` do token não está na lista que você passou com `jwt.WithValidMethods`, então o golang-jwt o recusou antes de chamar seu Keyfunc para obter a chave. A verificação existe porque o cabeçalho é controlado por quem envia o token, inclusive por um atacante: é o verificador, e não o token, que decide qual algoritmo é aceitável. A v5 classifica o erro como `ErrTokenSignatureInvalid`, o que o faz parecer uma assinatura inválida — na verdade, é uma rejeição pela política de algoritmos.
Por que acontece
O emissor mudou de algoritmo
comumProvedores de identidade migram de RS256 para ES256 ou adicionam chaves EdDSA. Verificadores que fixaram o algoritmo antigo rejeitam todos os tokens novos a partir do momento da troca.
A lista de algoritmos permitidos foi copiada de outro serviço
ocasionalUm middleware compartilhado, configurado para um emissor (RS256), é reutilizado para outro que assina com ES256. A lista de algoritmos permitidos precisa descrever o emissor por trás deste verificador específico.
Um token de outro lugar, ou uma sondagem
ocasionalTokens com `alg: HS256` ou `none` que chegam a uma API RS256/ES256 são típicos de sondagens de confusão de algoritmo. Continue rejeitando esses tokens.
Como corrigir
- 1.
Permitir exatamente o algoritmo do emissor
Leia o JWKS do emissor (o `alg` de cada chave) ou o documento de descoberta dele (`id_token_signing_alg_values_supported`) e fixe esses valores. Durante uma migração, liste os dois e selecione as chaves pelo `kid`.
go token, err := jwt.Parse(raw, keyfunc, jwt.WithValidMethods([]string{"ES256"}), // what the issuer signs with today jwt.WithIssuer("https://issuer.example.com/"), ) - 2.
Conferir o tipo do método no Keyfunc
Verificar o tipo concreto de `t.Method` no Keyfunc garante que uma chave ECDSA só seja usada com um algoritmo ECDSA, mesmo que a lista de algoritmos permitidos seja ampliada mais tarde.
go keyfunc := func(t *jwt.Token) (any, error) { // Belt and braces: the key type must fit the algorithm family. if _, ok := t.Method.(*jwt.SigningMethodECDSA); !ok { return nil, fmt.Errorf("unexpected signing method %v", t.Header["alg"]) } return lookupKey(t.Header["kid"]) }