无法从Facebook获取访问令牌。 有一个OAuthException说:“错误validationvalidation码”

我正在使用Java和我的演示应用程序的目的很简单:更新用户状态。 我遵循http://developers.facebook.com/docs/authentication上的服务器端stream程 。 我得到了auth对话框,facebook导致了callbackurl,并且在我的callback页面中获得了代码 。 然后,当我尝试生成访问令牌时,我失败了。

在指南页面中,它表示可以使用以下URL来生成访问令牌:

https://graph.facebook.com/oauth/access_token? client_id=YOUR_APP_ID&redirect_uri=YOUR_URL& client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE 

但是在我的环境中发生的是我收到以下错误信息:

 { "error": { "type": "OAuthException", "message": "Error validating verification code." } } 

我很确定每个参数是正确的,因为如果我更改client_id值或client_secret参数,我会得到不同的错误信息。 代码参数是我从Facebook的callback。 所以这应该是正确的,对吗? 真的不知道是什么问题….

任何想法呢? 我被困在这里

我最近处理了这个问题:一切都匹配,但失败的OAuthException。 使它工作的事情是改变redirecturi(在这两个请求stream)从:

http://foo.example.com

http://foo.example.com/

即,添加尾随斜线。 然后它的工作。 愚蠢而愚蠢的,但你去了。

我有同样的问题,并尝试了上述build议。 他们帮助,但在我的情况下,问题是,我的redirurl有一个查询参数和Facebook并不酷。 因此,故事的道理在于,您发送的用于交换令牌的redir url必须与原始redir url相同,且不能具有查询参数。

我们也有一些有趣的。

在我们的例子中,URL中的斜线已经存在,所以我尝试了我们在FBdebugging工具中使用的令牌,并且validation了它,所以看起来像FB甚至没有在请求中看到令牌。

经过一番调查之后,我发现了这个头巴 – 我们用HTTP Headers做了一个GET,而不是用一个Querystring,所以FB litterally根本没有看到这个令牌。

道德似乎是,如果你可以得到令牌在FBdebugging工具validation,有可能/某些/您的请求中的错误 –

这可能是一个缺less的“/”或其他与应用程序定义的URL不匹配(域mismatch是一个不同的错误)。 我还没有尝试定义应用程序/ Web Url HTTPS和HTTP请求,但我怀疑它也会打嗝。

或者在我们的情况下,请求方法可能是不正确的 – 使用标题GET或POST都扔2500,你必须做一个查询string的GET。

希望有所帮助!

我有同样的问题。 这是一个URL的差异,但不像其他已发布,我的是HTTP和HTTPS之间的区别。

我们有BigIP处理HTTPS请求并转发到HTTP Apache服务器。 当调用BaseFacebook的getCurrentUrl()函数时,它检测到HTTP,而不是原始的HTTPS。 我已经修改了这样的function:

 protected function getCurrentUrl() { if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (isset($_SERVER['HTTP_PSEUDOSSL']) && $_SERVER['HTTP_PSEUDOSSL'] == 'true')) { $protocol = 'https://'; } else { $protocol = 'http://'; } ... 

该版本支持HTTP_PSEUDOSSL密钥。 我希望这可以帮助别人。

是的,最后的斜线也适用于我,谢谢!

出于debugging目的,我发现使用开发者页面上提供的代码fb是很有帮助的:

http://developers.facebook.com/docs/authentication/

一旦你得到这个工作,你可以修改它以适应你自己的代码。

我不确定,但是您也可以检查以确保您的“网站url”和“网站域名”设置在App Edit屏幕上是正确的,因为根据文档,redirect_uri必须位于相同的域中。 (这是不同的canvas/标签页url。)

我也有一个URL的问题,但解决scheme是不同的。 我传递了JavaScript SDK返回给服务器的signedRequest ,并使用其中的code值来请求访问令牌。 但是,根据Facebook PHP SDK的3.1.1版本中的一些注释,JavaScript SDK将code与空string的redirect_uri关联,即""

 // the JS SDK puts a code in with the redirect_uri of '' if (array_key_exists('code', $signed_request)) { $code = $signed_request['code']; $access_token = $this->getAccessTokenFromCode($code, ''); if ($access_token) { // etc } } 

在我改变我自己的服务器端代码来使用redirect_uri"" ,那么访问令牌的请求就起作用了。

在我的情况下,我的代码不工作在IE浏览器。 这个问题在下面一行

 $user_id = $facebook->getUser(); if ($user_id) 

因为getUser函数总是返回0,所以这个条件总是成立的。 比他从无效标记中产生的错误。 那么,我只是这样说来解决它:

 if ($user_id>0) 

愚蠢的东西…