在Java

时间:2017-06-19 20:43:49

标签: java azure active-directory azure-active-directory azure-ad-graph-api

我是一位经验丰富的Java开发人员(4-5岁),但对Azure AD及其功能不熟悉,所以我提前为一个潜在的基本问题道歉。我一直在努力寻找任何涉及Java主题的Microsoft文档或Stack Overflow问题(绝大多数都在C#中),根据我的理解,C#拥有比Java更多的Azure AD库,因此C#中的解决方案不一定是解决方案。 Java的。

我正在尝试根据场景完成身份验证POC,其中存在一个充满用户的现有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();
    }

}

我的代码主要基于此Microsoft documentation

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

提前感谢您的帮助,我很乐意提供所需的任何说明。

1 个答案:

答案 0 :(得分:4)

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

要验证签名,首先我们应该检索并缓存歌唱令牌(公钥):1)第一个调用是发现端点。它的URL形成为&#39; /。众所周知/ openid-configuration&#39; .2)然后,您将在此处找到大量元数据,包括颁发者值和jwks_uri端点地址,以获取验证令牌签名的密钥。

令牌签名是根据JSON Web Key spec实施的。使用来自令牌标题的密钥ID和X.509证书指纹值(分别为kid和x5t参数),然后在获得的密钥集合中找到适当的公钥以验证签名。我不熟悉java,但你可以参考this thread,其中包括如何在Java中验证签名的代码示例。