我在验证 azure 活动目录令牌时遇到问题。我使用我的 application_id 以及用户的用户名和密码接收令牌。然后我会验证它,但它会导致签名无效。验证的代码片段如下:
// Request access token from AAD
IAuthenticationResult result = getAccessToken(userName, password);
String auth = result.accessToken();
DecodedJWT jwt = JWT.decode(auth);
JwkProvider provider = null;
Jwk jwk = null;
Algorithm algo = null;
try {
provider = new UrlJwkProvider(new URL("https://login.microsoftonline.com/common/discovery/keys"));
jwk = provider.get(jwt.getKeyId());
System.out.println(jwk.getPublicKey());
algo = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
algo.verify(jwt);
} catch (SignatureVerificationException e) {
System.out.println(e.getMessage());
} catch (JwkException e) {
e.printStackTrace();
}
我用这个方法检索令牌信息
private static IAuthenticationResult getAccessToken(String userName, String password)
throws MalformedURLException, InterruptedException, ExecutionException {
PublicClientApplication pca = PublicClientApplication.builder(
APP_ID).
authority(AUTHORITY).build();
String scopes = "User.Read";
UserNamePasswordParameters parameters = UserNamePasswordParameters.builder(
Collections.singleton(scopes),
userName,
password.toCharArray()).build();
IAuthenticationResult result = pca.acquireToken(parameters).get();
return result;
}
程序总是以捕获 SignatureVerificationException 结束。我尝试使用 jwt.io 手动验证令牌,在其中粘贴我将 kid
声明与 https://login.microsoftonline.com/common/discovery/keys 上的声明进行比较时获得的证书,但结果我也得到了无效签名。我的令牌是否有问题,因为验证过程都说 jwt.io 和我的 java 程序中的签名无效,或者是否有其他方法来验证 Azure AD 令牌?
编辑:解决方案是将范围从“User.Read”更改为“[client_id]/.default”。
答案 0 :(得分:0)
因为你拿到的是自定义api的token,而不是ms graph api的token。所以你需要将 scope
设置为:{api app client_id}/.default