为什么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还不支持该范围,尽管它有大量文档记录?

+0

列出了'offline_access'作用域。我可以证实这一点。 – GunnerFan

我发现此问题也很烦人。请仔细阅读,如果你正在使用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.