java - 尝试获取联系人时的 Microsoft Graph NoPermissionsInAccessToken
问题描述
我要做的是创建一个简单的 Microsoft Azure 应用程序,该应用程序使用 Microsoft Graph 获取所有联系人。我认为我了解它应该如何工作,但由于我无法真正使其工作,我需要一些帮助。
我设法获取了与他们文档网站上记录的用户数据相同的用户数据,但是当为联系人执行类似步骤时,我不断得到NoPermissionsInAccessToken
.
我的一般工作流程是使用以下方法检索令牌:
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
?client_id={clientId}
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fdetail
&response_mode=query
&scope=openid+offline_access+profile+user.read+Mail.ReadWrite+Contacts.ReadWrite
有了这个,我已经获得了授权码、刷新令牌等。现在我将该令牌插入到 AuthorizationCodeProvider
与示例中提供的相同的位置:
AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(
clientId,
Arrays.asList("openid", "offline_access", "profile", "user.read", "Mail.ReadWrite", "Contacts.ReadWrite"),
code,
"http://localhost:8080/detail",
NationalCloud.Global,
tenant,
secret);
IGraphServiceClient graphClient = GraphServiceClient
.builder()
.authenticationProvider(authProvider)
.buildClient();
IContactCollectionPage contacts = graphClient.me().contacts()
.buildRequest()
.get();
但是当应用程序尝试get()
从最后一个函数执行时,它会抛出以下内容:
401 : Unauthorized
Strict-Transport-Security : max-age=31536000
Cache-Control : private
x-ms-ags-diagnostic : {"ServerInfo":{"DataCenter":"West Europe","Slice":"SliceC","Ring":"5","ScaleUnit":"000","RoleInstance":"AGSFE_IN_53"}}
client-request-id : e393d9d1-1eae-44b2-9956-2b97c0105b42
request-id : fecedee8-8b69-44b1-b300-5c9f71d3c427
Content-Length : 284
Date : Thu, 13 Feb 2020 13:12:27 GMT
Content-Type : application/json
{
"error": {
"code": "NoPermissionsInAccessToken",
"message": "The token contains no permissions, or permissions can not be understood.",
"innerError": {
"request-id": "fecedee8-8b69-44b1-b300-5c9f71d3c427",
"date": "2020-02-13T13:12:27"
}
}
}
据我所知,我已经通过portal.azure.com
. 进入应用程序注册、我的应用程序、API 权限,并添加了已记录为必要的委托 Contacts.ReadWrite 权限。
知道我能做些什么来让这件事发挥作用吗?
解决方案
当您调用https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
它时,它返回的是授权码,而不是访问令牌。您需要通过 将该身份验证代码交换为访问令牌https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
。
您可以在文档中找到检索令牌的分步说明。
您的应用程序使用在上一步中收到的授权代码通过向端点发送
POST
请求来请求访问令牌。/token
推荐阅读
- javascript - Javascript切换多个按钮
- python - 为什么 for 循环中的这种无效语法?
- java - 如何从 xml 文件中的 TextView 获取文本到自定义对话框中的 TexView?
- java - 排序火力基地
- x86-64 - 打破 ELF/Linux 上的堆栈/调用帧信息链?
- angular - ASP.NET Core MVC IFormFile 415 不支持的媒体类型
- python - 如何在 Python 中替换字符串中的子字符串?
- python - 为什么等化矩阵元素不能正常工作
- java - 如何更正此 Callable 语句?
- java - 如何从将应用程序注册到 systemd 的 Java gradle 项目中获取 deb 包