首页 > 解决方案 > 示例项目之间为 Active Directory 返回的 AccessToken 不同

问题描述

我一直在使用两个示例项目对 Java 的 Azure Active Directory 访问进行试验:

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用于 spring-boot 嵌入式容器

我在 API 的使用方式上遇到了很大的不同,我无法理解。

在这两种情况下,我都通过使用我的 Azure 凭据登录来获得 AD 的 OAuth 令牌。在 Http 响应中,我得到了以下形式的授权代码:

亚喀巴...

然后使用以下 URL 作为 authContext: https : //login.microsoftonline.com/ {tenantId}

我通过以下调用获得 AuthenticationResult:

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 的形式为:

AQABAAAAAAADXzZ3ifr-GRbDT....

如果我以完全相同的方式使用它来尝试检索用户的个人资料图片,我会收到 401 Unauthorized 响应

这些 AccessToken 的形式和用途不同的原因是什么?

标签: javaazurespring-bootactive-directoryazure-active-directory

解决方案


这些 AccessToken 的形式和用途不同的原因是什么?

我假设您获得的访问令牌是授权代码而不是不记名令牌。

正如 Rohit Saigal 提到的,您可以使用JWT.IOJWT.MS进行检查。

如果我们想获取 Azure AD 图的访问令牌,我们可以使用以下代码来做到这一点。

public String index(Model model, OAuth2AuthenticationToken authentication) {
...
DefaultOidcUser user = (DefaultOidcUser)authentication.getPrincipal();
String accessToken = user.getIdToken().getTokenValue(); 
...
}

然后,如果您具有相应的权限,我们可以使用访问令牌访问 Azure AD 图形 API。


推荐阅读