這個問題已被問了幾次堆棧,但一直沒有真正的答案。無論如何,讓我試着解釋我的情況。Facebook OAuth登錄 - 訪問_token API返回「此授權碼已被使用」
我們使用使用Facebook OAuth2登錄的應用程序。這個登錄過去一直工作良好,直到上週,突然間它現在讓我們感到困擾。
申請流程:
步驟1:用戶按下與Facebook按鈕,登錄我們的網站上
第2步:重定向到Facebook的登錄/授權頁面
第3步:在授權應用程序時,回調來到我們的應用程序,使用短暫的「代碼」參數。
第4步:使用「https://graph.facebook.com/oauth/access_token」URL將此「代碼」參數交換爲60天的訪問令牌。
錯誤步驟4:
當我們試圖交流簡短生活「代碼」的訪問令牌,我們得到了來自Facebook這個錯誤。
{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}
觀察:
- 對於用戶誰是新來到應用程序,不會出現上面所說的錯誤。
- 對於返回的用戶,此調用失敗,出現上述錯誤。
- 我們的應用程序現在已經運行了9個多月,而且這個錯誤在過去的7-10天內纔出現。我們有成千上萬的用戶在此之前成功使用它。
我已經從論壇獲得:
這裏是我的什麼我讀的解釋。可能不準確。 Facebook有一些奇怪的政策,需要應用程序開發人員維護臨時10分鐘的代碼,直到在第一次登錄期間獲得的60天代碼過期。所以我們應該在用戶瀏覽器上用Access令牌創建一個cookie。我甚至能夠看到人們修改他們的代碼以創建cookie。
什麼讓我感到困擾?
- 建議的解決方案假定他們創建的cookie始終存在於用戶的瀏覽器中。這是一個糟糕的假設,因爲Cookie可能隨時被刪除。
- 我有另一個應用程序Id /應用程序的祕密,我用於我的發展(即本地主機),並完美的作品。登錄發生在那裏,但它唯一的問題產品機器。
- 自從我們推出這款應用程序以來,近10個月的時間裏,這個問題並沒有在生產機器上發生,而且它突然之間出現了。最糟糕的是,我無法獲得任何破壞此流程的最新變化記錄。
編輯:
平臺: Python中,谷歌的AppEngine。我們不使用任何Facebook SDK,我們直接對所有登錄URL進行HTTP調用。 調用失敗:https://graph.facebook.com/oauth/access_token - 我們在第一次調用發生後的20秒內傳遞appId,祕密和代碼(從facebook獲得)。
希望這裏有足夠的信息來表明我們的代碼並不完全錯誤。來自遇到並解決此問題的人的任何提示/指示是歡迎。如果它的Facebook bug和Facebook開發者注意到了,我會更加快樂。
代碼參數只能爲用戶訪問令牌交換一次。您的問題缺少有關您使用的平臺/語言以及您的確切API調用的可用信息。 – CBroe
@CBroe - 感謝您的通知。是的 - 我們明白代碼參數是一次性的,這就是爲什麼我們想要將它交換爲access_token,但訪問令牌URL失敗。我已經包含了有關平臺/語言的信息。 – Srivatsan