Fehlermeldung
oidc: malformed jwt: unexpected signature algorithm "ES256"; expected ["RS256"]
Auch ausgegeben als
- oidc: id token signed with unsupported algorithm, expected ["RS256"] got "ES256"
go-oidc v3.0–v3.5 prüfte den Algorithmus nach dem Parsen und formulierte es als „oidc: id token signed with unsupported algorithm, expected [\"RS256\"] got \"ES256\"“; spätere Releases (geprüft mit v3.10, v3.14, v3.17 und v3.21) lehnen ihn schon beim Parsen ab, daher „malformed jwt“.
coreos/go-oidc (Go) — IDTokenVerifier.Verify with the default SupportedSigningAlgs
Was der Fehler bedeutet
Das ID-Token ist mit einem Algorithmus signiert, der nicht in `SupportedSigningAlgs` des Verifiers steht. Ist diese Liste leer und wurde der Verifier nicht aus einem per Discovery ermittelten Provider erzeugt, fällt go-oidc auf RS256 als einzigen Algorithmus zurück – den Standard, den die Spezifikation von OpenID Connect vorschreibt –, deshalb wird jedes Token mit ES256, PS256 oder EdDSA abgelehnt, bevor seine Signatur geprüft wird. go-oidc meldet das als „malformed jwt“, weil die Prüfung schon beim Parsen der JWS stattfindet.
Warum der Fehler auftritt
Verifier von Hand ohne Algorithmen erzeugt
häufig`oidc.NewVerifier(issuer, keySet, &oidc.Config{ClientID: …})` ohne `SupportedSigningAlgs` akzeptiert nur RS256. Bei Providern, die mit ES256 signieren (und das tun viele selbst gehostete), scheitert die Prüfung sofort.
Der Provider hat seinen Signaturalgorithmus geändert
gelegentlichEin Verifier mit expliziter Liste scheitert, sobald der Provider auf einen Schlüssel eines anderen Typs rotiert. Verifier auf Basis der Discovery übernehmen den neuen Wert aus `id_token_signing_alg_values_supported`.
Das Token stammt nicht von diesem Provider
gelegentlichTokens eines anderen Ausstellers mit anderem Algorithmus scheitern an dieser Prüfung, noch bevor der Aussteller geprüft wird.
So behebst du den Fehler
- 1.
Algorithmus des Providers explizit angeben
Setze `SupportedSigningAlgs` auf den oder die Algorithmen, die der Provider verwendet. Halte die Liste kurz; sie ist eine Allowlist.
go verifier := oidc.NewVerifier(issuer, keySet, &oidc.Config{ ClientID: clientID, SupportedSigningAlgs: []string{oidc.ES256}, // what the provider actually signs with }) - 2.
Algorithmen aus der Discovery übernehmen
`provider.Verifier` liest die unterstützten Algorithmen aus den Metadaten des Providers, sodass nichts von Hand synchron gehalten werden muss.
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})