facebook错误'验证验证码时出错'

时间:2010-12-08 11:00:46

标签: php facebook urlencode

非常奇怪的错误。我使用gide http://developers.facebook.com/docs/authentication/。所以我创建了对fb的请求并传递了redirect_uri。我在localhost上使用测试站点。所以,如果我通过

  

REDIRECT_URI = http://localhost/test_blog/index.php

它工作正常,但如果我通过

  

REDIRECT_URI = http://localhost/test_blog/index.php?r=site/oauth2

它不想工作。我尝试使用

  

redirect_uri =。   进行urlencode(“http://localhost/test_blog/index.php?r=site/oauth2

但不行。 我尝试解释。我成功获得代码,但当我访问https://graph.facebook.com/me?access_token时,我收到错误'错误验证验证码'。我检查过,错误在?r = site / oauth2 ,但我需要传递一些参数 有人能帮助我吗? 我阅读了帖子http://forum.developers.facebook.net/viewtopic.php?id=70855,但没有任何对我有用

12 个答案:

答案 0 :(得分:128)

目前(截至2011年3月)有关制作有效redirect_uri的内容的无证要求。

首先,要授权的redirect_uri参数和access_token必须匹配

显然,Facebook(或更确切地说是OAuth2)使用redirect_uri作为内部密钥来编码为access_token请求返回的代码。它有点聪明,因为它验证回到您的网站。它解释了为什么access_token请求本来不需要redirect_uri参数需要一个。

其次,你不能在redirect_uri中使用很多特殊字符

很多讨论都在争论是否可以传递参数。他们可以,你是有限的哪些字符是有效的,但没有人发布我知道的列表。 url / html编码等传统方法将失败,因为百分比(%)无效。斜杠(/)无效,因此嵌套的重定向URL将始终失败。克服特殊字符限制的唯一方法是将参数的值编码为base64。如果您使用的是ASP.NET,请查找Convert.ToBase64。

最后,这更像是一个侧面说明。有很多程序员传递错误信息,一个简单的解决方案是传递type = client_cred。这可能会限制您访问授权中请求的某些权限。这是不可取的。

答案 1 :(得分:51)

使用redirect_uri=http://localhost:8000(编码为http%3A%2F%2Flocalhost%3A8000)进行测试时,整天都遇到同样的问题......

解决方案只是确保将尾部斜杠/放在uri的末尾。所以redirect_uri=http://localhost:8000/(编码为http%3A%2F%2Flocalhost%3A8000%2F)。

再次确保redirect_uri对于两个请求都相同。

答案 2 :(得分:17)

我遇到了这个问题。我知道我的URL是相同的,因为我使用了一个具有相同$ var的类,但我一直在JSON响应中获得400响应和错误。

我唯一做的就是改变我的redirect_uri:

http://myredirecturi.com

http://myredirecturi.com/

是的,只是添加了斜杠并且它有效。

答案 3 :(得分:8)

你真的不需要编码,只需将'/'放在redirect_url的末尾,一切都应该没问题!

答案 4 :(得分:6)

Aaron Wheeler提供的部分信息不正确。

两个请求中的'redirect_uri'参数确实必须相同,但完全可以对常规网址进行网址编码,并将其用作'redirect_url'参数的值,只要您小心对任何内联网址进行进一步的URL编码。

例如,您希望Facebook重定向到以下网址:

http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants

尝试将用户重定向到

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
. urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants');

如果/Party/Pants创建无效网址

,则会失败

但是,重定向到

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode('/Party/pants'));

将按预期工作。

如果您在第二个验证应用程序请求中使用返回的redrect_uri值,请确保再次进行url编码 - 填充$ _GET超全局时,该值会自动进行URL解码。 - 这就是让我失望的原因。

'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567'
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode($_GET['my_param_1']));

P.S。在您的实际代码中,我建议使用sprintf()而不是像我的示例中那样将字符串链接在一起,以提高可读性。

答案 5 :(得分:5)

从我所看到的,这里的问题是redirect_uri必须以'/'结尾而不包含'?'或其他特殊字符。我认为这就是为什么你得到'错误验证验证码'的原因。只有在使用file_get_contents()时才会出现此错误,而在使用facebook php库时则不会出现此错误。 这是php的解决方案,不知道这个错误是否出现在其他SDK中。

答案 6 :(得分:2)

我不确定它是否会有所帮助,但我建议只对网址中的值进行编码。不是全部。例如:

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');

答案 7 :(得分:1)

我正在使用pb并最终修复它在url中添加type = client_cred参数。

答案 8 :(得分:1)

为此苦了一段时间。由于我不需要重定向,但是需要redirect参数,因此我的解决方案是简单地将其设置为空-

...&redirect_uri=&client_secret=...

答案 9 :(得分:0)

我遇到了同样的问题。

不可否认,如果这个解决方案在实际操作中没有任何意义,我是超级n00b,请原谅。

我只需使用我的FB Connect按钮在页面中设置一个带有测试变量的短保险丝cookie(1-2分钟)。当FB返回信息到我的数据解析/处理脚本时,我检查了这个cookie,我正在重定向它,如果找到,使用header:location将用户引导到正确的URL。

当然有些浏览器/用户等禁用cookie。这显然不会在那里工作(可能使用会话var并在fb数据处理程序中销毁它?)我确信有更好的方法可以做到这一点,但此刻,这个bandaid工作。

答案 10 :(得分:0)

我注意到你正在使用我正在使用的Yii并且在半天内遇到同样的问题。如上所述,问题是您的网址i.e. r=site/oath2

中的特殊字符

您可以通过在配置中启用漂亮的网址来修复此问题,以便您的网址变为index.php/site/oath2

它似乎没有尾随斜线。

答案 11 :(得分:0)

我的答案是:

$user = $facebook->getUser();     
if (!$user) {
    $loginUrl = $facebook->getLoginUrl(array(
        'scope' => '',
        'redirect_uri' => $this->domain,
    ));
    print('<script> top.location.href=\'' . $loginUrl . '\'</script>');
}

在我找到这个解决方案之前,我已经开了很长时间了,似乎我不是唯一有这个问题的人,我希望这对你有用!