OAuth& facebook access_token无法正常工作,需要OAuth专家

时间:2012-11-18 12:28:22

标签: facebook facebook-graph-api oauth-2.0 facebook-oauth

我已经阅读了1000多个关于redirect_uri在两次调用OAuth中以获取用户令牌的方式相同的博客,但是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
   }
}

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

在过去的一个月里,这对我来说似乎有所突破。我们在7月下旬做了一个节目,事情很好(因为它是一个不同的服务器,因为该节目有不同的基本URL)。可能是URL是这种格式:

someprestuff.morestuff.mainurl.com?prm=value

Facebook的URL有太多“部分”可以接受吗?

我正在寻找其他寻找的东西。

4 个答案:

答案 0 :(得分:7)

网址应该相同,必须进行转义。在网址中,它必须如下所示:

http%3A//someprestuff.morestuff.mainurl.com%3Fprm%3Dvalue

答案 1 :(得分:2)

Jim上面的评论有效,但澄清一下,这是一个针对我们修正它的正斜线。

答案 2 :(得分:1)

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

答案 3 :(得分: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