这个问题已被问了几次堆栈,但一直没有真正的答案。无论如何,让我试着解释我的情况。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