为什么 Microsoft Oauth2 API 更改授权请求的范围?
Why is Microsoft Oauth2 API changing the scope of authorization requests?
我正在创建一个需要从 Microsoft Work 帐户请求用户授权的应用程序。并偶然发现了两次。
起初,我只是想阅读用户电子邮件,所以我请求了以下范围:
- User.Read
- Mail.Read
- Mail.Read写入
- Mail.ReadWrite.Shared
- Mail.Read.共享
但是,我一直收到 "scope has changed" 错误,并注意到来自微软的授权响应自动包括请求的 Mail.Send 范围,甚至如果我没有请求它并且它不存在于授权网页上。
我的用户不关心额外的授权,所以我只是在我的请求中添加了 Mail.Send 并继续前进。很好
我现在需要将 offline_access 添加到范围列表中,这样我才能获取刷新令牌并将应用程序 运行 保留在后台。但是当我这样做时,Microsoft 回复我一个缺少 'offline_access' 授权的授权请求,即使授权页面显示“离线访问您的数据”并且在身份验证期间没有发生错误,但我的 Oauth2 流程因 "scope has changed" 错误而中断:
Scope has changed from "mail.readwrite mail.read.shared mail.read
mail.readwrite.shared mail.send offline_access user.read" to "mail.readwrite
mail.read.shared mail.read mail.readwrite.shared mail.send user.read"
这是 Microsoft Oauth 流程中的错误,还是我做错了什么?
编辑:我查看了 https://apps.dev.microsoft.com/ 上的应用程序权限,并且“offline_access”范围不是在那里列出,或任何其他看似相关的范围。也许这意味着 Graph 尚不支持该范围,尽管它已被大量记录?
有文件/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py
。
[1]
如图所示,有一个环境变量 "OAUTHLIB_RELAX_TOKEN_SCOPE"。只需将其添加到您的环境中,值为 'True' 或 1.
我也发现这个问题很烦人。如果您使用 Python & oauthlib 来处理身份验证请求,请继续阅读 -
在 Python 3 和 requests_oauthlib 库中,这会生成 Warning
,而不是 Exception
。如果您查看源代码,那么您会在 oauthlib/oauth2/rfc6749/parameters.py
:
中找到这些行
if not os.environ.get('OAUTHLIB_RELAX_TOKEN_SCOPE', None):
w = Warning(message)
w.token = params
w.old_scope = params.old_scopes
w.new_scope = params.scopes
raise w
所以您所要做的就是在您的环境中将 OAUTHLIB_RELAX_TOKEN_SCOPE
变量设置为 True
,以忽略此警告。
我正在创建一个需要从 Microsoft Work 帐户请求用户授权的应用程序。并偶然发现了两次。
起初,我只是想阅读用户电子邮件,所以我请求了以下范围:
- User.Read
- Mail.Read
- Mail.Read写入
- Mail.ReadWrite.Shared
- Mail.Read.共享
但是,我一直收到 "scope has changed" 错误,并注意到来自微软的授权响应自动包括请求的 Mail.Send 范围,甚至如果我没有请求它并且它不存在于授权网页上。
我的用户不关心额外的授权,所以我只是在我的请求中添加了 Mail.Send 并继续前进。很好
我现在需要将 offline_access 添加到范围列表中,这样我才能获取刷新令牌并将应用程序 运行 保留在后台。但是当我这样做时,Microsoft 回复我一个缺少 'offline_access' 授权的授权请求,即使授权页面显示“离线访问您的数据”并且在身份验证期间没有发生错误,但我的 Oauth2 流程因 "scope has changed" 错误而中断:
Scope has changed from "mail.readwrite mail.read.shared mail.read
mail.readwrite.shared mail.send offline_access user.read" to "mail.readwrite
mail.read.shared mail.read mail.readwrite.shared mail.send user.read"
这是 Microsoft Oauth 流程中的错误,还是我做错了什么?
编辑:我查看了 https://apps.dev.microsoft.com/ 上的应用程序权限,并且“offline_access”范围不是在那里列出,或任何其他看似相关的范围。也许这意味着 Graph 尚不支持该范围,尽管它已被大量记录?
有文件/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py
。
[1]
如图所示,有一个环境变量 "OAUTHLIB_RELAX_TOKEN_SCOPE"。只需将其添加到您的环境中,值为 'True' 或 1.
我也发现这个问题很烦人。如果您使用 Python & oauthlib 来处理身份验证请求,请继续阅读 -
在 Python 3 和 requests_oauthlib 库中,这会生成 Warning
,而不是 Exception
。如果您查看源代码,那么您会在 oauthlib/oauth2/rfc6749/parameters.py
:
if not os.environ.get('OAUTHLIB_RELAX_TOKEN_SCOPE', None):
w = Warning(message)
w.token = params
w.old_scope = params.old_scopes
w.new_scope = params.scopes
raise w
所以您所要做的就是在您的环境中将 OAUTHLIB_RELAX_TOKEN_SCOPE
变量设置为 True
,以忽略此警告。