4

我已经阅读了 1000 多篇关于如何在两次 OAuth 调用中 redirect_uri 必须相同才能获得用户令牌的博客,但是 100% 的时间,无论我如何格式化 URL,它都会失败:

{
   "error": {
      "message": "Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request",
      "type": "OAuthException",
      "code": 100
   }
}

我一直一丝不苟地确保两个调用中的 URL 完全相同。我的网址必须有一个?在其中,我尝试用 %3f 替换它,但这没有帮助。必须有其他可能导致此错误的原因,我需要了解可能是什么?

在过去的一个月里,这似乎打破了我。我们在 7 月下旬做了一个节目,一切正常(该节目的基本 URL 不同,因为它是不同的服务器)。会不会是 URL 是这种格式:

someprestuff.morestuff.mainurl.com?prm=value

Facebook 接受的 URL 是否有太多“部分”?

我正在寻找替代的东西来寻找。

4

4 回答 4

7

url 应该相同,并且必须转义。在 url 中,它必须如下所示:

http%3A//someprestuff.morestuff.mainurl.com%3Fprm%3Dvalue
于 2012-11-18T12:40:30.593 回答
2

吉姆上面的评论有效,但要澄清的是,这是一个正斜杠,它为我们修复了它。

于 2014-02-18T23:14:22.117 回答
1

今天遇到了同样的问题,原来是redirect_uri使用了http:// URL Schema,而Facebook只接受https://

于 2014-02-24T15:39:24.137 回答
0

我刚刚在负载均衡器后面的服务器上完成了对这个问题的跟踪。事实证明,当负载均衡器传递HTTP_X_FORWARDED_PROTO标头时,不知何故,在 V3 PHP Facebook 库、PHP 和 Apache 之间,标头没有被识别。

以下是库中的相关代码:

 protected function getHttpProtocol() {
    if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
      if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        return 'https';
      }
      return 'http';
    }
    /*apache + variants specific way of checking for https*/
    if (isset($_SERVER['HTTPS']) &&
        ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] == 1)) {
      return 'https';
    }
    /*nginx way of checking for https*/
    if (isset($_SERVER['SERVER_PORT']) &&
        ($_SERVER['SERVER_PORT'] === '443')) {
      return 'https';
    }
    return 'http';
 }

如您所见,这里适应了一些场景,因此您必须确保正确配置适用于您的任何情况,以便此代码块成功。

最可能的解决方案是在您的 facebook 配置数组中trustForwarded设置true

于 2014-12-30T14:32:30.157 回答