Mensagem de erro
oidc: malformed jwt: unexpected signature algorithm "ES256"; expected ["RS256"]
Também aparece como
- oidc: id token signed with unsupported algorithm, expected ["RS256"] got "ES256"
O go-oidc v3.0–v3.5 verificava o algoritmo depois da análise e formulava a mensagem como “oidc: id token signed with unsupported algorithm, expected [\"RS256\"] got \"ES256\"”; versões posteriores (verificadas na v3.10, v3.14, v3.17 e v3.21) rejeitam o token durante a análise, daí o “malformed jwt”.
coreos/go-oidc (Go) — IDTokenVerifier.Verify with the default SupportedSigningAlgs
O que significa
O token de ID foi assinado com um algoritmo que não está em `SupportedSigningAlgs` do verificador. Quando essa lista está vazia e o verificador não foi criado a partir de um provedor descoberto, o go-oidc recorre apenas ao RS256 — o padrão que a especificação do OpenID Connect exige — e, assim, qualquer token ES256, PS256 ou EdDSA é rejeitado antes que a assinatura seja verificada. O go-oidc relata isso como “malformed jwt” porque a verificação acontece durante a análise do JWS.
Por que acontece
Verificador criado à mão sem algoritmos
comumUm verificador criado com `oidc.NewVerifier(issuer, keySet, &oidc.Config{ClientID: …})` sem `SupportedSigningAlgs` aceita apenas RS256. Provedores que assinam com ES256 (e muitos auto-hospedados fazem isso) falham imediatamente.
O provedor mudou o algoritmo de assinatura
ocasionalUm verificador com uma lista explícita deixa de funcionar quando o provedor faz a rotação para uma chave de outro tipo. Verificadores baseados em descoberta obtêm o novo valor de `id_token_signing_alg_values_supported`.
O token não é deste provedor
ocasionalTokens de outro emissor, com um algoritmo diferente, esbarram nesta verificação antes da verificação do emissor.
Como corrigir
- 1.
Listar explicitamente o algoritmo do provedor
Defina `SupportedSigningAlgs` com o algoritmo (ou os algoritmos) que o provedor usa. Mantenha a lista curta: ela é uma lista de algoritmos permitidos.
go verifier := oidc.NewVerifier(issuer, keySet, &oidc.Config{ ClientID: clientID, SupportedSigningAlgs: []string{oidc.ES256}, // what the provider actually signs with }) - 2.
Deixar que a descoberta forneça os algoritmos
O `provider.Verifier` lê os algoritmos aceitos nos metadados do provedor, então nada precisa ser sincronizado à mão.
go // provider.Verifier takes the algorithms from id_token_signing_alg_values_supported. provider, err := oidc.NewProvider(ctx, issuer) if err != nil { return err } verifier := provider.Verifier(&oidc.Config{ClientID: clientID})