【问题标题】:Unable to get access token from Facebook. Got an OAuthException says "Error validating verification code"无法从 Facebook 获取访问令牌。收到 OAuthException 提示“验证验证码错误”
【发布时间】:2011-06-27 11:10:37
【问题描述】:

我正在使用 java,我的演示应用程序的目的很简单:更新用户状态。 我遵循了http://developers.facebook.com/docs/authentication 页上的服务器端流程。我得到了身份验证对话框,facebook 引导到回调 url,我在回调页面中得到了 code。然后,当我尝试生成访问令牌时失败了。

在指南页面中,它说以下网址可用于生成访问令牌:

https://graph.facebook.com/oauth/access_token?
     client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
     client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

但在我的环境中发生的情况是我收到以下错误消息:

{
   "error": {
      "type": "OAuthException",
      "message": "Error validating verification code."
   }
}

我很确定每个参数都是正确的,因为如果我更改 client_id 值或 client_secret 参数,我会收到不同的错误消息。 code 参数是我从 facebook 回调中得到的。所以这应该是正确的,对吧?实在想不通是什么问题......

对此有任何想法吗?我被困在这里...

【问题讨论】:

  • 我自己解决了这个问题......关键问题都是关于“URL”的。代码生成url中的回调“redirect_uri”也应该和token生成url中的“redirect_uri”一样...
  • 绝对无价。非常感谢。
  • @DeepNightTwo 非常感谢,太完美了。
  • 这对我也有帮助。可笑的是它不在文档中,我认为它必须在该步骤之后重定向到不同的东西......
  • 我正在使用相同的 uri,但它不起作用。顺便说一句,我正在使用带有 https 的重定向 url,有问题吗?

标签: facebook token


【解决方案1】:

我最近正好处理了这个问题:一切都匹配,但由于 OAuthException 而失败。使它起作用的事情是将重定向 uri(在两个流请求中)从:

http://foo.example.com

http://foo.example.com/

即,添加尾部斜杠。然后它起作用了。又傻又傻,但是你去吧。

【讨论】:

  • 谢谢!多年来,我一直试图弄清楚这一点。多么愚蠢的问题。
  • 您在哪里更改了重定向 uri?我在 Facebook 的应用页面上没有看到此设置。
  • 非常感谢。一段时间以来,我一直在我的桌子上敲打我的头,试图弄清楚这一点。
  • 这个答案确实为我节省了 30 分钟可怕的挫败感。
  • 为了大声哭泣!我已经坚持了几个小时,这解决了它。谢谢先生。不过还是很烦人。
【解决方案2】:

是的,斜杠也对我有用,谢谢!

出于调试目的,我发现完全使用 fb 在开发者页面上提供的代码很有帮助:

http://developers.facebook.com/docs/authentication/

一旦你得到它的工作,你可以修改它以适合你自己的代码。

我不确定,但您也可以检查以确保“应用程序编辑”屏幕上的“站点 URL”和“站点域”设置正确,因为根据文档,redirect_uri 必须位于同一域中. (这与画布/标签页 url 不同。)

【讨论】:

    【解决方案3】:

    我们也从中获得了一些乐趣。

    在我们的例子中,URL 中的斜杠已经存在,所以我尝试了我们在 FB Debug Tool 中使用的 Token 并验证了它,所以看起来 FB 甚至没有在请求中看到 Token。

    经过一番调查,我发现了令人头疼的问题 - 我们只使用 HTTP 标头而不使用查询字符串进行 GET,因此 FB 根本没有看到令牌。

    寓意似乎是,如果您可以在 FB 调试工具中验证令牌,则您的请求中可能存在 /something/ 错误 -

    可能是缺少“/”或与应用程序定义的 URL 不匹配(域不匹配是另一个错误)。我没有尝试为 HTTPS 定义 App / Web Url 并使用 HTTP 执行请求,但我怀疑它也会以某种方式打嗝。

    或者在我们的例子中,请求方法可能不正确 - 带有标头的 GET 或 POST 都抛出 2500,您必须使用 Querystring 执行 GET。

    希望有帮助!

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题并尝试了上述建议。他们提供了帮助,但就我而言,问题在于我的 redir URL 有一个查询参数,而 Facebook 对此并不满意。因此,故事的寓意是,您发送来交换令牌的 redir url 必须与原始 redir url 相同,并且不能有查询参数。

      【讨论】:

      • 查询参数是可以的,但是在第二次调用代码换取token时需要保持一致
      • 我确保这两个 URL 是相同的。它们仅在它们相同并且没有查询参数时才起作用。还尝试了未编码的 URL 编码。
      • 使用 state 参数将您想要的任何额外参数发送到重定向的 URL:可选。用于维护请求和回调之间的应用程序状态的不透明字符串。当 Facebook 将用户重定向回您的 redirect_uri 时,该值将原封不动地包含在响应中。 developers.facebook.com/docs/reference/dialogs/oauth
      【解决方案5】:

      我遇到了同样的问题。这是一个 URL 差异,但与其他发布的不同,我的是 HTTP 和 HTTPS 之间的差异。

      我们让 BigIP 处理 HTTPS 请求并转发到 HTTP Apache 服务器。当 BaseFacebook 的 getCurrentUrl() 函数被调用时,它检测到的是 HTTP,而不是原始的 HTTPS。我已经像这样修改了该函数:

      protected function getCurrentUrl() {
          if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) ||
              (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || 
              (isset($_SERVER['HTTP_PSEUDOSSL']) && $_SERVER['HTTP_PSEUDOSSL'] == 'true')) {
            $protocol = 'https://';
          }
          else {
            $protocol = 'http://';
          }
      ...
      

      此版本支持HTTP_PSEUDOSSL 键。我希望这对某人有所帮助。

      【讨论】:

        【解决方案6】:

        我也遇到了 url 问题,但解决方法不同。我将JavaScript SDK 返回到服务器的signedRequest 传递给服务器,并使用其中的code 值来请求访问令牌。但是,根据Facebook PHP SDK的3.1.1版本中的一些cmets,JavaScript SDK将code与一个空字符串的redirect_uri相关联,即""

        // the JS SDK puts a code in with the redirect_uri of ''
        if (array_key_exists('code', $signed_request)) {
            $code = $signed_request['code'];
            $access_token = $this->getAccessTokenFromCode($code, '');
            if ($access_token) {
               // etc
            }
        }
        

        在我将自己的服务器端代码更改为使用 redirect_uri"" 之后,访问令牌的请求就成功了。

        【讨论】:

          【解决方案7】:

          就我而言,我的代码无法在 IE 上运行。 问题出在下面一行

          $user_id = $facebook->getUser();
          if ($user_id)
          

          因为不知何故 getUser 函数总是返回 0,所以这个条件总是成立的。比他从无效令牌产生的错误。 好吧,我只是这样说来解决它:

          if ($user_id>0)
          

          愚蠢的东西......

          【讨论】:

            猜你喜欢
            • 2012-01-19
            • 2011-06-07
            • 1970-01-01
            • 1970-01-01
            • 2018-09-07
            • 2015-02-25
            • 1970-01-01
            • 1970-01-01
            • 2018-01-09
            相关资源
            最近更新 更多