为 Active Directory 返回的 AccessToken 在示例项目之间是不同的



我一直在使用两个示例项目尝试使用 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。

最新更新