本文へスキップ
ecdsa.com
coreos/go-oidc (Go)Go

エラーメッセージ

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」として報告します。

発生する理由

修正方法

  1. 1.

    プロバイダーのアルゴリズムを明示的に列挙する

    `SupportedSigningAlgs` に、プロバイダーが使うアルゴリズムを設定してください。これは許可リストなので、短く保ってください。

    go
    verifier := oidc.NewVerifier(issuer, keySet, &oidc.Config{
    	ClientID:             clientID,
    	SupportedSigningAlgs: []string{oidc.ES256}, // what the provider actually signs with
    })
  2. 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})

関連するエラー

署名エラーデータベースをすべて見る