在Java中验证Azure AD签名

dFr*_*sco 3 java active-directory azure azure-active-directory azure-ad-graph-api

我是一位经验丰富的Java开发人员(4-5年),但是对Azure AD及其功能不熟悉,因此我对潜在的基本问题表示歉意。我一直在努力寻找任何有关Java中涉及此主题的Microsoft文档或Stack Overflow问题(绝大多数使用C#),据我了解,C#比Java具有更多的Azure AD库,因此C#中的解决方案不一定是Java中的解决方案。 Java。

我正在尝试基于一个场景来完成身份验证POC,在该场景中,我想利用现有Azure Azure AD系统来充实用户,以此作为身份验证点。我的Java应用程序将收集用户的用户名和密码(我理解这是不建议使用的,但不理想,但出于传统原因),然后使用Microsoft adal4j库调用Azure终结点,我可以成功返回JWC访问权限令牌(除了刷新和ID令牌外)。

这是我现有的检索JWC访问令牌的代码段。

private static AuthenticationResult getAccessTokenFromUserCredentials(String username, String password, String 
AUTHORITY, String CLIENT_ID) throws Exception {
    AuthenticationContext context = null;
    AuthenticationResult result = null;
    ExecutorService service = null;
    try {
        service = Executors.newFixedThreadPool(1);
        context = new AuthenticationContext(AUTHORITY, false, service);
        Future<AuthenticationResult> future = context.acquireToken(
                "https://graph.windows.net", CLIENT_ID, username, password,
                null);
        result = future.get();
    } finally {
        service.shutdown();
    }

    if (result == null) {
        System.out.println("ex)");
    }
    return result;
}

public void azureAuthenticate(String authority, String clientID, String username, String password){
    AuthenticationResult result = null;
    try {
        result = getAccessTokenFromUserCredentials(username, password, authority, clientID);
        DecodedJWT accessToken = JWT.decode(result.getAccessToken());
        //Want to verify the validity of this access token
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

我的代码主要基于此Microsoft文档

收到令牌后,我需要能够验证其真实性(我了解确认其声明的业务逻辑方面,但是对于如何验证签名是否合法我感到困惑)。

预先感谢您的任何帮助,我们很高兴提供所需的任何说明。

Nan*_* Yu 5

来自Azure AD的访问令牌是JSON Web令牌(JWT),由安全令牌服务在私钥中签名。甲JWT令牌是一种非加密的数字签名的有效载荷JSON含有不同属性(权利要求书),以识别用户。签名是JWT的最后一部分,需要用于验证有效负载。此签名是使用标头中描述的算法生成的(如果从AAD发出,则为RS256),以防止未经授权的访问。有关JWT令牌的更多详细信息,请参阅此文档

为了验证签名,首先我们应该检索并缓存唱歌令牌(公钥):1)第一个调用是发现端点。它的URL格式为'/.well-known/openid-configuration'.2)然后,您将在此处找到很多元数据,包括发行者值和jwks_uri端点地址,以获取用于验证令牌签名的密钥。

令牌签名是根据JSON Web密钥规范实现的。使用令牌头中的密钥ID和X.509证书指纹值(分别为kd和x5t参数),然后在获得的密钥集合中找到适当的公共密钥以验证签名。我对Java不熟悉,但是您可以参考此线程,其中包括有关如何在Java中验证签名的代码示例。