gpt4 book ai didi

Facebook OAuth 登录 - access_token API 返回 "This authorization code has been used"

转载 作者:行者123 更新时间:2023-11-30 05:15:53 25 4
gpt4 key购买 nike

这个问题在 Stack 上被问过几次,但一直没有真正的答案。无论如何,让我试着解释一下我的情况。

我们使用一个使用 Facebook OAuth2 登录的应用程序。这个登录在上周之前一直工作正常,现在突然间让我们很困扰。

申请流程:

第 1 步:用户在我们的网站上按下“使用 Facebook 登录”按钮

第 2 步:重定向到 Facebook 登录/授权页面

第 3 步:在授权应用程序时,回调会到达我们的应用程序,并带有一个短暂的“代码”参数。

第 4 步:此“代码”参数将使用“https://graph.facebook.com/oauth/access_token”URL 交换为 60 天的访问 token 。

第 4 步错误:

当我们尝试用访问 token 交换短期“代码”时,我们从 Facebook 收到此错误。

{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}

观察:

  1. 对于应用的用户,不会出现上述错误。
  2. 对于返回的用户,此调用因上述错误而失败。
  3. 我们的应用程序已经运行了 9 个多月,而这个错误仅在过去 7-10 天内出现。在此之前,我们已经有成千上万的用户成功使用它。

我已经从论坛获得的内容:

这是我对所读内容的解释。可能不准确。Facebook 有一些奇怪的政策,要求应用程序开发人员保留临时的 10 分钟代码,直到首次登录期间获得的 60 天代码到期。所以我们应该在用户的浏览器上创建一个带有访问 token 的 cookie。我什至能够看到人们为了创建 cookie 而修改他们的代码。

真正困扰我的是什么?

  1. 建议的解决方案假定他们创建的 cookie 将始终存在于用户的浏览器中。这是一个错误的假设,因为 cookie 可能随时被删除。
  2. 我有另一个用于我的开发的应用程序 ID/应用程序 secret (即本地主机),它运行良好。在那里登录正常,但只有产品机器有问题。
  3. 这个问题在我们上线后近10个月没有在生产机上出现过,突然就来了。最糟糕的是,我无法获得任何打破此流程的最近更改的记录。

编辑:

平台:Python、Google Appengine。我们不使用任何 Facebook SDK,我们直接对所有登录 URL 进行 HTTP 调用。失败的调用:https://graph.facebook.com/oauth/access_token - 我们在第一次调用发生后的 20 秒内传递 appId、 secret 和代码(从 facebook 获得)。

希望这里有足够的信息来表明我们的代码并非完全不正确。欢迎遇到并解决此问题的人提供任何提示/指示。如果这是 Facebook 的错误,并且 Facebook 开发人员注意到了,我会更高兴。

最佳答案

我通过使用随机 GUID 解决了这个问题,该 GUID 附加到我传递到 facebook 的每个回调 url。 Facebook 返回的代码似乎由几部分组成,包括您必须指定的 redirect_uri 参数。通过使用此 GUID 技巧,您的应用程序可以继续运行,但 Facebook 认为它是一个不同的 URL,因此会生成一个新代码。

如果您将该 GUID 存储在一个临时 session 中,它总是相同的。这是我的意思的一个非常简化的版本。我正在使用 C#,但解决方案是相同的:

在我开始 oauth 过程之前:

Session["facebook_buster"] = System.Guid.NewGuid().ToString();

然后开始登录:

var facebook = new FacebookClient();

var loginUrl = facebook.GetLoginUrl(new
{
client_id = ...,
redirect_uri = ..."/facebook/oauthcallback?buster=" + Session["facebook_buster"].ToString(),
display = "popup",
scope = "publish_stream,user_photos"
});

然后在我的回调方法中,当我想将该代码交换为新的 access_token 时:

var facebook = new FacebookClient();

dynamic result = facebook.Post("oauth/access_token", new
{
client_id = ...,
client_secret = ...,
redirect_uri = ..."/facebook/oauthcallback?buster=" + Session["facebook_buster"].ToString(),
code = Request["code"] // this is the returned code from the first method
});

请注意,在第二种方法中,我使用相同的 session key ,以便授权代码成功。

整个上午都在通过撤销权限/手动更改我存储的 access_token(在我的数据库中)/完全删除我存储的 access_token 来测试这个,它每次都有效。

希望这对您有所帮助!

关于Facebook OAuth 登录 - access_token API 返回 "This authorization code has been used",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19047980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com