Pular para o conteúdo
ecdsa.com
golang-jwt/jwt (Go)Go

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

Como corrigir

  1. 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. 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"])
    }

Erros relacionados

Ver toda a base de erros de assinatura