當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的離線。我也無法通知用戶他們需要重新授權。
即使用戶未取消訪問權限,您是否可以確認是否收到此錯誤?通常,當用戶通過在MyGlass中關閉Glassware或轉到他們的帳戶頁面並撤消令牌來撤銷訪問時,會發生此錯誤。 – Alain
剛剛收到用戶將其切換回來的消息。這是永久撤銷訪問權限還是臨時關閉? –
永久撤銷訪問權限。用戶需要再次通過授權流程才能爲您提供一組新的OAuth 2.0憑據。 – Alain