エラーメッセージ
oidc: malformed jwt: unexpected signature algorithm "ES256"; expected ["RS256"]
別の表記
- oidc: id token signed with unsupported algorithm, expected ["RS256"] got "ES256"
go-oidc v3.0〜v3.5 は解析後にアルゴリズムをチェックし、「oidc: id token signed with unsupported algorithm, expected [\"RS256\"] got \"ES256\"」と表記していました。それ以降のリリース(v3.10、v3.14、v3.17、v3.21 で確認)は解析中に拒否するため、「malformed jwt」となります。
coreos/go-oidc (Go) — IDTokenVerifier.Verify with the default SupportedSigningAlgs
このエラーの意味
ID トークンは、検証者の `SupportedSigningAlgs` に含まれていないアルゴリズムで署名されています。このリストが空で、検証者がディスカバリで取得したプロバイダーから作成されていない場合、go-oidc は RS256 のみにフォールバックします(OpenID Connect の仕様が必須と定めるデフォルトです)。そのため、ES256、PS256、EdDSA のトークンは、署名がチェックされる前にすべて拒否されます。このチェックは JWS の解析中に行われるため、go-oidc はこれを「malformed jwt」として報告します。
発生する理由
アルゴリズムを指定せずに手動で作成した検証者
よくある`SupportedSigningAlgs` を指定しない `oidc.NewVerifier(issuer, keySet, &oidc.Config{ClientID: …})` は、RS256 しか受け入れません。ES256 で署名するプロバイダー(セルフホストのプロバイダーの多くがそうです)では、すぐに失敗します。
プロバイダーが署名アルゴリズムを変更した
ときどき明示的なリストを持つ検証者は、プロバイダーが鍵のローテーションで別の種類の鍵に切り替えると動作しなくなります。ディスカバリに基づく検証者は、`id_token_signing_alg_values_supported` から新しい値を取得します。
トークンがこのプロバイダーのものではない
ときどきアルゴリズムの異なる別の発行者のトークンは、発行者のチェックより先に、このチェックで失敗します。
修正方法
- 1.
プロバイダーのアルゴリズムを明示的に列挙する
`SupportedSigningAlgs` に、プロバイダーが使うアルゴリズムを設定してください。これは許可リストなので、短く保ってください。
go verifier := oidc.NewVerifier(issuer, keySet, &oidc.Config{ ClientID: clientID, SupportedSigningAlgs: []string{oidc.ES256}, // what the provider actually signs with }) - 2.
アルゴリズムをディスカバリから取得する
`provider.Verifier` はプロバイダーのメタデータからサポートされているアルゴリズムを読み込むため、手動で同期を保つ必要はありません。
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})