Azure ADから発行されるアクセストークンが検証できない
解決したいこと
Azure ADから発行されたアクセストークンの署名検証を通したい。
現在、Azure AD(OP)とAWS ALB(RP)でOpenID Connect認証(OIDC)をしています。
AWS ALB配下にアプリ(EC2)があり、アプリ側でALBから連携される、「x-amzn-oidc-accesstoken」
を取得し、MSの公開鍵を使って署名検証していますが、下記エラーが発生しています。
恐らく、コードではなくALBかAzure ADの設定に問題がありそうな気がしていますが、どの辺を確認すればよいかわかっていません。
原因や確認ポイントがわかる方はいらっしゃいますでしょうか?
発生している問題・エラー
com.auth0.jwt.exceptions.signatureverificationexception:the token's signature resulted invalid when verified using the algorithm:sha256withrsa
該当するソースコード
ソースは掲載ができないのですが、qiitaのサイト(※1)の下方にある、公開鍵方式のRS256の署名検証コードを参考に実装しています
仕様ライブラリ:java-jwt
1.HTTPヘッダからアクセストークン(x-amzn-oidc-accesstoken)を取得
2.アクセストークンをデコード(JWT.decode)し、kidを取得
3.MSのエンドポイントからkidに関連する公開鍵情報(UrlJwkProvider)を取得
4.公開鍵情報(RSAPublicKey)を引数に、署名検証用のRS256アルゴリズム(Algorithm.RSA256)を生成
5.オプション(with~)は指定せずに、アクセストークンの署名を検証(verifier)
※1・・・https://qiita.com/kurotsu/items/909d2da7e79866b756ca
自分で試したこと
・x-amzn-oidc-accesstokenで取得したアクセストークンをjwt.ioに貼り付けたところ、
headerとpayloadは問題なく表示されたが、ページ下方に「Invalid Signature」と表示されてしまう。
プログラム云々の前に、発行されたトークン自体が署名検証できてない状態になっている?
・1のトークン部分をクラスメソッド様のサイト(※1)に記載のトークン(IDトークンの例ですが)に
差し替えて実行したところ、「com.auth0.jwt.exceptions.TokenExpiredException:the token has
expired on 2021-09-12T14:37:05Z」 とエラーが変わった(検証は通った?)ため、
コード自体は問題なさそう(?)。jwt.ioでも「Signature Verified」と表示される。
※1・・・https://dev.classmethod.jp/articles/azure-ad-id-token-verify-jwt-to-pem/
他に調べたことで、理解できていないこと
・QAサイト(※1)では、「アクセストークンはMicrosoft Graph用にエンコードされているため、他からは検証できない」との回答がある。
となると、アプリ側では「x-amzn-oidc-data」にある、IDトークンしか使えない??
・掲示板(※2)では、「Microsoft GraphのscopeをdefaultしたらOK」のような書き込みがあるが、
Azure ADの「APIのアクセス許可」の「Microsoft Graph」を選択しても、
defaultのような選択肢はなかった。現在は「User.Read」のみ。
・別の人(※3)ではAzure ADから発行されたアクセストークンが検証できたような記載になっている。。。
※1・・・https://learn.microsoft.com/en-us/answers/questions/300849/access-token-signature-validation
※2・・・https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609
※3・・・https://qiita.com/ham0215/items/ab39b3a2e45a597a75c1