Azure AD 令牌签名的验证无效。使用算法验证时令牌的签名无效:SHA256withRSA

时间:2021-05-21 15:34:41

标签: java azure validation jwt token

我在验证 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”。

1 个答案:

答案 0 :(得分:0)

因为你拿到的是自定义api的token,而不是ms graph api的token。所以你需要将 scope 设置为:{api app client_id}/.default