【问题标题】:Microsoft Graph NoPermissionsInAccessToken when trying to fetch contacts尝试获取联系人时的 Microsoft Graph NoPermissionsInAccessToken
【发布时间】:2020-05-29 08:05:49
【问题描述】:

我要做的是创建一个简单的 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 权限,并添加了委派的联系人。记录为必要的读写权限。

知道我可以做些什么来使这件事发挥作用吗?

【问题讨论】:

    标签: java microsoft-graph-api


    【解决方案1】:

    当您调用https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize 时,它返回的是授权码,而不是访问令牌。您需要通过https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token 将该身份验证代码交换为访问令牌。

    您可以在documentation 中找到检索令牌的分步说明。

    您的应用使用在上一步中收到的授权代码通过向/token 端点发送POST 请求来请求访问令牌。

    【讨论】:

    • 你是对的,我写帖子时的错误,但是我需要提供给 AuthorizationCodeProvider 的是授权码,而不是令牌,我这样想对吗?然后 IGraphServiceClient 应该负责其余的工作,或者至少这是我的理解。我刚才确实尝试放置访问令牌而不是授权代码。不走运,一切都坏了。
    • 您将 Auth Code 发送到 /token 并返回一个带有 access_token 属性的 JSON 对象。该属性中的值是您需要提供给 Graph 的值。
    • 我已经尝试过了,我只是得到: InvalidAuthenticationToken 错误消息:CompactToken 解析失败,错误代码:80049217 GET graph.microsoft.com/v1.0/me SdkVersion : graph-java/v1.5.0 授权当我检查 AuthorizationCodeProvider构造函数,我可以看到它确实需要身份验证代码而不是访问令牌。如果我不使用 IGraphServiceClient,你所说的确实成立。但是 IGraphServiceClient 稍后会将身份验证代码换成令牌,所以我不必这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多