如何在OAuth 2请求中同时使用Microsoft Graph和Office 365范围?

时间:2017-04-19 04:23:23

标签: oauth-2.0 microsoft-graph

我正在从https://login.microsoftonline.com/common/oauth2/v2.0/authorize请求OAuth2.0令牌。我正在申请这些范围:

[
 'https://graph.microsoft.com/User.Read', 
 'https://graph.microsoft.com/Calendars.Read.Shared', 
 'offline_access', 
 'profile', 
 'email', 
 'https://outlook.office.com/mail.read'
]

我正在尝试同时获得Microsoft Graph范围和Office 365范围,但它给了我:

  

AADSTS70011:输入参数“scope”的提供值无效。范围https://graph.microsoft.com/User.Read https://graph.microsoft.com/Calendars.Read.Shared offline_access个人资料电子邮件https://outlook.office.com/mail.read无效

如果我取出outlook.office.com范围或两个graph.microsoft.com范围,那么它就可以了。

有没有办法可以同时访问它们?

2 个答案:

答案 0 :(得分:1)

v2.0 auth模型不支持请求同一请求中两个资源的权限,尝试分离请求,只要获得每个资源受众的访问令牌,就可以访问这两个API。

答案 1 :(得分:0)

这是一种不同的方法,它允许您访问多个资源,只需一个登录请求(但访问令牌不同)。

根据所使用的流程,应该向您返回一个刷新令牌,它可以为您提供不同资源的访问令牌。

检索访问令牌

  1. 通过仅从一个资源(例如 Graph)请求范围来获取令牌 A(以及刷新令牌)。
  2. 使用 token refresh request 获取令牌 B,方法是仅从其他资源 (Office 365) 请求范围

在您的情况下,令牌刷新原始 HTTP 请求将如下所示(身份验证代码流):

POST /common/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
&scope=https://outlook.office.com/mail.read
&refresh_token=...
&grant_type=refresh_token
&client_secret=...

上述注意事项:正文中添加了换行符以提高可读性。 scope 应该是 url 编码的。

您现在有两个令牌:A 适用于 Graph,而 B 适用于 Office 365。

需要多资源刷新令牌

只能使用多资源刷新令牌。您可以在 openid-configuration 中查看支持。要显示特定于租户的配置,请将 url 中的 common 替换为租户域。

<块引用>

microsoft_multi_refresh_token:可选。一个布尔值,指示 OpenID 提供程序是否支持多资源刷新令牌,这些刷新令牌可以兑换为向 AD FS 服务器注册的任何资源的访问令牌。

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-oidce/586de7dd-3385-47c7-93a2-935d9e90441c