Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试获取联系人时,Microsoft Graph NoPermissionsInAccessToken_Java_Microsoft Graph Api - Fatal编程技术网

Java 尝试获取联系人时,Microsoft Graph NoPermissionsInAccessToken

Java 尝试获取联系人时,Microsoft Graph NoPermissionsInAccessToken,java,microsoft-graph-api,Java,Microsoft Graph Api,我想做的是创建一个简单的Microsoft Azure应用程序,用Microsoft Graph获取所有联系人。我想我知道它应该如何工作,但鉴于我未能真正使它工作,我需要一些帮助 我设法获取了与他们的文档站点上记录的相同的用户数据,但当为联系人执行类似的步骤时,我不断获取NoPermissionsInAccessToken 我的常规工作流程是使用以下方法检索令牌: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize ?

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


你知道我能做些什么来让这东西工作吗?

当你打电话给
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
它返回的是授权码,而不是访问令牌。您需要通过https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

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

您的应用程序通过向
/token
端点发送
POST
请求,使用上一步中接收到的授权码请求访问令牌


当您呼叫
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
它返回的是授权码,而不是访问令牌。您需要通过https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

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

您的应用程序通过向
/token
端点发送
POST
请求,使用上一步中接收到的授权码请求访问令牌


你是对的,我在写文章时犯了错误,但是我需要向AuthorizationCodeProvider提供的是授权代码,而不是令牌,我这样想对吗?然后,IGraphServiceClient应该处理其余的事情,或者至少这是我的理解。不过,我刚才确实尝试放置访问令牌而不是授权代码。运气不好,一切都会中断。您将身份验证代码发送到/token,然后返回一个带有access\u token属性的JSON对象。该属性中的值是您需要提供给Graph的值。我已经尝试过了,我刚刚得到:InvalidAuthenticationToken错误消息:CompactToken解析失败,错误代码:80049217 get-SdkVersion:Graph java/v1.5.0 Authorization当我签出AuthorizationCodeProvider构造函数时,我可以看到,它确实需要身份验证代码而不是访问令牌。如果我没有使用IGraphServiceClient,你所说的是正确的。然而,后来IGraphServiceClient用身份验证代码交换令牌,所以我不必这样做。你是对的,我在写文章时犯了错误,但是我需要向AuthorizationCodeProvider提供的是授权代码,而不是令牌,我这样想对吗?然后,IGraphServiceClient应该处理其余的事情,或者至少这是我的理解。不过,我刚才确实尝试放置访问令牌而不是授权代码。运气不好,一切都会中断。您将身份验证代码发送到/token,然后返回一个带有access\u token属性的JSON对象。该属性中的值是您需要提供给Graph的值。我已经尝试过了,我刚刚得到:InvalidAuthenticationToken错误消息:CompactToken解析失败,错误代码:80049217 get-SdkVersion:Graph java/v1.5.0 Authorization当我签出AuthorizationCodeProvider构造函数时,我可以看到,它确实需要身份验证代码而不是访问令牌。如果我没有使用IGraphServiceClient,你所说的是正确的。不过,稍后IGraphServiceClient会用身份验证代码交换令牌,所以我不必这样做。