当前位置: 首页 > 知识库问答 >
问题:

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

鞠晋
2023-03-14

我正在从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脱机访问配置文件电子邮件https://outlook.office.com/mail.read无效

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

有没有办法同时访问两者?

共有2个答案

澹台星剑
2023-03-14

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

根据使用的流,应该向您返回一个刷新令牌,这可以为您获得不同资源的访问令牌。

  1. 通过仅从一个资源(例如 Graph)请求范围来获取令牌 A(以及刷新令牌)。
  2. 通过仅从其他资源请求范围,使用令牌刷新请求获取令牌 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=...

上面的注意:为了易读性,在正文中添加了换行符。范围应该是url编码的。

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

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

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

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

谭毅然
2023-03-14

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

 类似资料:
  • 更改TestResource 并向QueryFactory添加 我理解使用请求范围需要。然而,当我运行它时,我得到一个异常,它告诉我 我看不出哪里出了问题。你能给我指出这个配置应该如何正确地完成吗?

  • 在我的Play(Java)框架项目中,我正在使用Guice进行依赖项注入,并且正在努力理解如何最好地将“会话”的概念与Guice和Play结合使用? 我知道Play是无状态的,除了可以在cookie中存储值之外,实际上没有会话的概念。我对Guice和Play的理解是,虽然Guice文档描述了支持不同的作用域(单例、会话、请求、无作用域),但因为我们正在用每个请求实例化一个新的注入器,所以仅适用于P

  • 我们正在使用OAuth2。0表示安全性。我在网上浏览了很多资源,每个人都在使用客户id、客户机密以及用户名和密码。但是我只想要client_id和client_secret,并且获得不带用户名和密码的访问令牌。 任何帮助将高度赞赏。

  • 虽然不是EAS 16.1的一部分,但我们还希望注意到Office 365和Outlook.com客户现在都可以通过EAS使用OAuth 2.0协议进行授权。 我的问题是:我应该在oauth请求中使用哪个范围? 有没有一个例子,也许是完整的请求?

  • 我有一个web应用程序,它有一个Spring集成逻辑,在一个单独的线程中运行。问题是,在某个时候,我的Spring集成逻辑尝试使用请求范围的bean,然后我得到以下错误: 我有ContextLoaderListener设置: 我的作用域Bean是这样注释的(因为我听说代理我的Bean会有帮助): 我所做的可能吗?如果是,我在这里遗漏了什么?如果没有,关于我如何实现这一目标,还有其他建议吗?

  • 基于CGLIB的请求范围bean的堆栈跟踪() 基于JDK-Dynamic-Proxy-Interface的请求范围bean的堆栈跟踪()