2017-01-23 61 views
1

我正在創建一個應用程序,需要從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

回答

0

我發現此問題也很煩人。請仔細閱讀,如果你正在使用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您的環境中,忽略這個警告。

-1

有文件/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py

[1]

正如你可以在圖片中看到有一個環境變量 「OAUTHLIB_RELAX_TOKEN_SCOPE」。只需將此值添加到您的環境中,值爲'True'或1.