2013-06-05 106 views
2

當OAuth2Credential對象嘗試刷新其access_token時,有時會收到invalid_grant錯誤,然後無法刷新。我使用的代碼基於Google的python API和Mirror API示例。嘗試刷新令牌時獲取invalid_grant

背景:

  • 使用用於認證和OAuth2Credential對象oauth2client模塊。
  • 存放OAuth2Credential對象醃製和base64'd到像谷歌自己的示例代碼
  • 數據庫中使用apiclient模塊做出鏡API
  • 此代碼在3臺不同的服務器上運行的呼叫,都表現出了同樣的問題時,嘗試發送
  • 我問是"https://www.googleapis.com/auth/glass.timeline""https://www.googleapis.com/auth/userinfo.profile"
  • 我可以證實,ACCESS_TYPE設置的範圍爲「脫機」
  • 我萬一
  • 要求approval_prompt是「力」

這裏是一個被用來調用鏡API代碼:

from apiclient.discovery import build 
http = credential.authorize(http=httplib2.Http()) 
service = build("mirror", "v1", http=http) 
payload = <JSON_PAYLOAD_HERE> 
service.timeline().insert(body=payload).execute() 

當服務被調用時,有潛力爲它發出401,這意味着需要被刷新的access_token 。然後它調用刷新方法,除了AccessTokenRefreshError,其錯誤爲invalid_grant。此時,由於access_token已過期,並且refresh_token只會給出相同的錯誤,所以證書與雙層一樣好。

我已經看到網頁說這可能是由於NTP問題,但我已經確認(甚至切換NTP服務器)我的服務器是同步的。另一個記錄的可能性是隻有25個刷新標記可以在它們被回收之前存在,但是我已經在Credential對象上實現了一個store()方法,所以當刷新時,新的憑證被保存到位(我可以確認這是有效的因爲我在數據庫中看到刷新時的新信息)。

既然不能得到用戶的憑據啓動參展需求這個問題,我無法解釋任何其他條件重新不是「等待一段時間」等問題。我已經看到這個問題很快發生在認證和發送一個電話之後,一直到一百個電話後一週的時間。

現在要解決問題的唯一方法是要求用戶重新授權,但這不是一個解決方案,因爲我期望在沒有用戶交互的情況下使用api的離線。我也無法通知用戶他們需要重新授權。

+2

即使用戶未取消訪問權限,您是否可以確認是否收到此錯誤?通常,當用戶通過在MyGlass中關閉Glassware或轉到他們的帳戶頁面並撤消令牌來撤銷訪問時,會發生此錯誤。 – Alain

+0

剛剛收到用戶將其切換回來的消息。這是永久撤銷訪問權限還是臨時關閉? –

+0

永久撤銷訪問權限。用戶需要再次通過授權流程才能爲您提供一組新的OAuth 2.0憑據。 – Alain

回答

1

回覆評論主題:用戶已經從MyGlass網站上切斷玻璃器皿,導致令牌被撤銷。

用戶需要經過授權流程再次爲了能夠通過或停留的玻璃器皿授​​權端點或「上的」切換回上如果有MyGlass使用玻璃器皿。

+0

您是否有一段代碼可以放入示例項目中,該代碼將檢測令牌何時被撤銷並重新導向到驗證頁面? –

相關問題