为什么 Microsoft Oauth2 API 更改授权请求的范围?

Why is Microsoft Oauth2 API changing the scope of authorization requests?

我正在创建一个需要从 Microsoft Work 帐户请求用户授权的应用程序。并偶然发现了两次。

起初,我只是想阅读用户电子邮件,所以我请求了以下范围:

但是,我一直收到 "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,以忽略此警告。