为什么Microsoft Oauth2 API会更改授权请求的范围?
我正在创建一个应用程序,需要从Microsoft Work帐户请求用户授权。并偶然陷入了这两次。为什么Microsoft Oauth2 API会更改授权请求的范围?
起初,我只是想阅读用户的电子邮件,所以我要求以下范围:
- User.Read
- Mail.Read
- Mail.ReadWrite
- 邮件.ReadWrite.Shared
- Mail.Read.Shared
不过,我一直getti ng“范围已更改”错误,并且注意到来自Microsoft的授权响应自动将范围包括到请求中,即使我没有请求它并且它不存在于授权网页上。
我的用户不关心额外的认证,所以我只是加了Mail.Send我的要求,并继续前进。精细。
我现在需要在范围列表中包含offline_access,以便我可以获取刷新令牌并让应用程序在后台运行。但是当我这样做时,即使授权页面显示“离线访问您的数据”并且在身份验证过程中没有错误发生,微软仍然会以缺少'offline_access'授权的授权请求回复我,但是我的Oauth2流被打破了“范围发生了变化“错误:
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还不支持该范围,尽管它有大量文档记录?
我发现此问题也很烦人。请仔细阅读,如果你正在使用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
您的环境中,忽略这个警告。
有文件/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py
。
[1]
正如你可以在图片中看到有一个环境变量 “OAUTHLIB_RELAX_TOKEN_SCOPE”。只需将此值添加到您的环境中,值为'True'或1.
列出了'offline_access'作用域。我可以证实这一点。 – GunnerFan