2010-12-08 472 views
53

很奇怪的错误。我使用gide http://developers.facebook.com/docs/authentication/。所以我创建fb请求并传递redirect_uri。我在本地主机上使用测试站点。所以,如果我通过facebook错误'验证验证码错误'

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

我看到我们可以使用url重写像http://localhost/tes...php/site/oauth2但它只是有趣的如何解决问题 – kusanagi 2010-12-08 12:59:42

回答

125

目前(截至2011年3月)关于什么使得有效的redirect_uri有无证的要求。

首先,这两个redirect_uri参数都要授权并且access_token必须匹配

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

二,你不能在redirect_uri中使用许多特殊字符。

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

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

+1

优秀的解释,谢谢你 – 2011-05-08 04:33:15

+1

谢谢:)有帮助 – DhruvPathak 2011-05-26 08:13:49

+2

@迈克尔是男人! – 2011-08-24 01:28:54

2

我不知道它是否会有所帮助,但我会建议只编码URL中的值。不是全部。例如:

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

它没有帮助,我试了 – kusanagi 2010-12-08 15:59:23

+0

这一个为我工作 - 它必须是引起问题的参数中的'/' - 谢谢 – Richard 2014-11-18 12:39:18

1

我在使用pb,最后修复了在url中添加type = client_cred参数的问题。

+2

我不会推荐这个。 type = client_cred参数用于不同的用例。 – Bryan 2011-08-17 15:33:44

5

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

+0

删除?从url为我解决了这个问题。谢谢。 – Ajibola 2014-02-06 15:25:19

0

我刚刚有同样的问题。

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

我只需在页面上用我的FB Connect按钮设置一个短熔断器cookie(1-2分钟),并在页面中显示一个测试变量。当FB返回信息给我的数据解析/处理脚本时,我检查了这个cookie,我重定向了它,如果找到了,使用header:location指示用户正确的URL。

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

47

redirect_uri=http://localhost:8000(编码为http%3A%2F%2Flocalhost%3A8000)测试时...

解决方式是确保把结尾的斜线/的URI的结尾有同样的问题一整天。所以redirect_uri=http://localhost:8000/(编码为http%3A%2F%2Flocalhost%3A8000%2F)。

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

0

我注意到你正在使用我正在使用的Yii,并且半天的时间也有同样的问题。如前所述,问题出在你的URL中的特殊字符i.e. r=site/oath2

你可以在你的配置使漂亮的网址,以便您的网址将成为index.php/site/oath2

似乎没有结尾的斜线工作虽然解决它。

6

Aaron Wheeler给出的部分信息不正确。

这是事实,“REDIRECT_URI”参数必须在两个请求相同,但这是完全可能的URL编码规则的URL和使用,作为价值的“REDIRECT_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创建一个无效URL

然而,重定向到

'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()而不是像我的示例一样将字符串链接在一起,以获得更好的可读性。

0

对我来说,答案是这样的:

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

我已经破解我的头很长一段时间才找到这个解决方案,似乎我不是唯一一个有这个问题,我希望这对你的作品至!

16

我有这个问题。我知道一个事实,即我的URL是相同的,因为我使用了一个具有相同$ var的类,但是我一直在获取400响应,并且在JSON响应中出现了该错误。

我做的唯一的事情就是从改变我的REDIRECT_URI:

http://myredirecturi.com 

http://myredirecturi.com/ 

叶,刚添加的尾随斜线和它的工作。

8

你并不需要编码,只需将'/'放在redirect_url的末尾,一切都应该很好!