本文介紹了無法使用Nimbus驗證來自Azure的訪問令牌簽名的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在此example之后,我編寫了一些代碼來驗證從Azure隱式流返回的訪問令牌。
RemoteJWKSet remoteJWKSet = new RemoteJWKSet(new URL(jwksUri));
JWSKeySelector keySelector = new JWSVerificationKeySelector(JWSAlgorithm.RS256, remoteJWKSet);
ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor<>();
jwtProcessor.setJWTClaimsSetVerifier(new DefaultJWTClaimsVerifier(
new JWTClaimsSet.Builder().issuer("https://sts.windows.net/3283e312-f73b-47d0-81c6-75e3ac726c21/").build(),
new HashSet<>(Arrays.asList("sub", "iat", "exp", "scp"))));
jwtProcessor.setJWSKeySelector(keySelector);
JWTClaimsSet claimsSet = jwtProcessor.process(accessToken.getValue(), null);
但驗證失敗,我得到:
com.nimbusds.jose.proc.BadJWSException: Signed JWT rejected: Invalid signature
at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:378)
at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:303)
at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:294)
我認為我不需要DefaultJWTClaimsVerifier
部分,但刪除它不會改變任何事情。我只希望它能堅持這個例子。
您知道為什么會發生這種情況嗎?
感謝您的幫助。
PS:無法使用jwt.io進行驗證。我粘貼了Access_Token和來自jwk的";key";部分的第一個條目。
推薦答案
您需要expose an API scope
在Azure中,并讓客戶端使用它。還要確保訪問令牌的JWT報頭中沒有nonce
字段。我的blog post有更多信息。
Azure AD行為
以上行為完全特定于Microsoft,并且在將Azure AD用作提供程序時是必需的:
JWT標頭中帶有隨機數字段的令牌僅針對MS API(如Graph)設計,并使用內部驗證機制。其目的是使這些應用程序始終無法通過自定義API的驗證。
您自己的自定義API的令牌必須通過請求自定義作用域的客戶端檢索。請注意,在Azure AD中配置的OAuth客戶端可以是一個邏輯條目,而不需要為每個單獨的API維護一個。
我認為MS的行為是基于OAuth resource indicators的,雖然我個人傾向于在API中接收訪問令牌時使用更主流的scopes、claims和受眾檢查技術。
這篇關于無法使用Nimbus驗證來自Azure的訪問令牌簽名的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,