問題
-
OpenID Connectを使用して 認証を 設定すると、ログインに失敗し、以下のエラーが報告されます:
トークンを検証できません:署名されたJWTが拒否されました:別のアルゴリズムが期待されるか、一致するキーが見つかりません。
環境
- DXP 7.3
- DXP 7.4
- Apereo CASをOpenIDプロバイダとして使用する
解像度
- CASのJWKS URLは、オンラインチュートリアルやドキュメントに記載されている多くのデフォルト設定において、キーにアルゴリズムの説明(alg フィールドの欠落)が含まれていないことが確認されている。 あなたのJWKSのURLはおそらく次のようなものだろう:
{
"keys": [
{
"kty": "RSA",
"n": "[REDACTED]",
"e": "AQAB"
}
]
}
- 特定のアルゴリズムがalgフィールドに指定されるように、CASのJWKS URL出力を修正する必要があります。 RS256はほとんどの場合問題ありませんが、CASとLiferayがJWTトークンをデコードするために使用するhttps://connect2id.com/products/nimbus-jose-jwtライブラリ(CASとNimbus JOSE JWTのバージョンに注意してください)の両方でサポートされていると仮定して、別の値を選択することができます。
- CASのコンフィギュレーションをどのように更新するかは、このファーストトラックの記事の範囲外である。 Apereo CASのドキュメントを参照してください。
- これがJWKS URLの出力です:
{
"keys": [
{
"kty": "RSA",
"alg": "RS256",
"n": "[REDACTED]",
"e": "AQAB"
}
]
}
追加情報
- Liferayの以前のバージョンでは、アルゴリズム選択に関する別のバグがありましたが、最新のDXP 7.3リリースとDXP 7.4では修正されています: https://help.liferay.com/hc/en-us/articles/17201700314125-OpenID-Connect-Error-Signed-JWT-rejected
- https://datatracker.ietf.org/doc/html/rfc7517#section-4.4、 algフィールドはオプションである。 このフィールドがないということは、OpenIDプロバイダがあらゆるアルゴリズムをサポートしていることを意味する。 しかし、クライアントとOpenIDプロバイダの両方がお互いを理解できるように、アルゴリズムを指定するのがベストプラクティスです。 Nimbus JOSE JWTライブラリのアプローチは、明示的にマッチするキーを探すことであり、algが指定されていない場合、JWKS出力からキーを選ばないのはそのためである。
- OpenIDプロバイダが同じキーで複数のアルゴリズムを明示的にサポートしている場合、ベストプラクティスはサポートされているアルゴリズムごとに1つのキーレコードを出力することです。
- Liferayが使用しているnimbus-jose-jwtのバージョンは、このgradleファイルをチェックすることで知ることができます: https://github.com/liferay/liferay-portal/blob/master/modules/apps/portal-security-sso/portal-security-sso-openid-connect-impl/build.gradle
- 私たちはApereo CASでalgフィールドがないことを確認しただけですが、私たちがまだ遭遇したことのない、あまり普及していない他のOpenIDプロバイダでもこの動作が存在する可能性があります。 もしそうなら、解決策は同じだ。