我一直在使用两个示例项目尝试使用 Azure Active Directory 访问 Java:
1( https://github.com/AzureAD/azure-activedirectory-library-for-java 使用OAuth令牌构建独立战争以确保安全,以及
2( 弹簧引导嵌入式容器的 https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-backend-sample
我在 API 的使用方式上遇到了很大的差异,我无法理解。
在这两种情况下,我都通过使用我的 Azure 凭据登录来获取 AD 的 OAuth 令牌。 在 Http 响应中,我得到一个形式的授权代码:
AQABAAIAAAD.....
然后使用以下 URL 作为身份验证上下文: https://login.microsoftonline.com/{租户ID}
我通过进行以下调用获得身份验证结果:
Future<AuthenticationResult> future = authContext.acquireTokenByAuthorizationCode(authorizationCode, redirectUri, credential, null);
在 Adal4j 项目 (1( 中,AuthenticationResult 的 AccessToken 的形式如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6I...
我可以将其用作 HTTP 调用中的持有者令牌,以通过 https://graph.windows.net/myorganization/me/thumbnailPhoto?api-version=1.6 检索用户的个人资料图片
而在 SpringBoot AD 示例中,从完全相同的调用返回的 AccessToken 的形式如下:
AQABAAAAAADXzZ3ifr-GRbDT....
如果我以完全相同的方式使用它来尝试检索用户的个人资料图片,我会得到 401 未经授权的响应
这些访问令牌的形式和使用存在差异的原因是什么?
> 这些访问令牌的形式和使用方式存在差异的原因是什么?
我假设您获得的访问令牌authorization_code而不是持有者令牌。
正如Rohit Saigal提到的,你可以使用JWT。IO 或 JWT.MS 来检查这一点。
如果我们想获取 Azure AD 图的访问令牌,可以使用以下代码来执行此操作。
public String index(Model model, OAuth2AuthenticationToken authentication) {
...
DefaultOidcUser user = (DefaultOidcUser)authentication.getPrincipal();
String accessToken = user.getIdToken().getTokenValue();
...
}
然后,如果你具有辅助腐蚀权限,则可以使用访问令牌访问 Azure AD 图形 api。