我是一位经验丰富的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
收到令牌后,我需要能够验证其真实性(我理解确认其声明的业务逻辑方面,但我对如何验证签名是合法的感到困惑。)
提前感谢您的帮助,我很乐意提供所需的任何说明。
答案 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中验证签名的代码示例。