非常奇怪的错误。我使用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,但没有任何对我有用
答案 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>');
}
在我找到这个解决方案之前,我已经开了很长时间了,似乎我不是唯一有这个问题的人,我希望这对你有用!