java - 示例项目之间为 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 的形式和用途不同的原因是什么?
解决方案
这些 AccessToken 的形式和用途不同的原因是什么?
我假设您获得的访问令牌是授权代码而不是不记名令牌。
正如 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。
推荐阅读
- python - Python List 对象没有属性位置
- python - Web Scraping - 在输入标签内写入
- matlab - 如何在 MATLAB 上绘制概率密度图
- r - 根据特定条件从另一个向量中的值替换向量中的值
- java - 从 ActionListener 调用时,JProgressbar 不显示
- ionic-framework - 无法发现 Ionic BLE 外围设备
- sql - MariaDB,用 char 和 int 生成一个 id
- typescript - 什么是 Vue 3 组合 API 定义方法的类型安全方式
- python - 安装psychopy的问题-错误:命令'swig.exe'失败或无法连接到无
- ios - TabView 内部的不同 UIView