我正在使用java,我的演示应用程序的目的很简单:更新用户状态。 我按照第http://developers.facebook.com/docs/authentication页上的服务器端流程进行了操作。我得到了auth对话框,facebook导致回调网址,我在回调页面中获得了代码。然后,当我尝试生成访问令牌时,我失败了。
在指南页面中,它表示可以使用以下网址生成访问令牌:
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回调中得到的。所以这应该是正确的,对吧?真的无法弄清楚是什么问题......
对此有何想法?我被困在这里......
答案 0 :(得分:64)
我最近处理了这个问题:一切都匹配,但是OAuthException失败了。使其工作的是从:
更改重定向uri(在流的两个请求中)到
即,添加尾部斜杠。然后它奏效了。愚蠢而愚蠢,但你去了。
答案 1 :(得分:6)
我遇到了同样的问题并尝试了上述建议。他们提供了帮助,但在我的情况下,问题是我的redir URL有一个查询参数,而Facebook并不酷。因此,故事的寓意是你发送的用于交换令牌的redir url必须与原始redir url相同,并且它不能有查询参数。
答案 2 :(得分:3)
我们也有一些乐趣。
在我们的例子中,URL中的尾部斜杠已经存在,所以我尝试了我们在FB Debug Tool中使用的令牌并进行了验证,所以看起来FB甚至没有在请求中看到令牌
经过一番调查后,我找到了头脑 - 我们使用HTTP标头进行GET,而不是使用Querystring,因此FB根本没有看到令牌。
道德似乎是,如果您可以在FB调试工具中验证令牌,您的请求中可能存在/某些/错误 -
可能是缺少“/”或其他与App定义的URL不匹配(域名不匹配是一个不同的错误)。我没有尝试为HTTPS定义App / Web Url并使用HTTP执行请求,但我怀疑它也会以某种方式打嗝。
或者在我们的例子中,请求方法可能不正确 - 使用Headers或POST的GET都抛出2500,你必须使用Querystring进行GET。
希望有所帮助!
答案 3 :(得分:3)
我遇到了同样的问题。这是一个URL差异,但与发布的其他内容不同,我的是HTTP和HTTPS之间的区别。
我们让BigIP处理HTTPS请求并转发到HTTP Apache服务器。当调用BaseFacebook的getCurrentUrl()函数时,它检测到HTTP,而不是原始HTTPS。我已经修改了这个功能:
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
密钥。我希望这有助于某人。
答案 4 :(得分:2)
是的,尾随斜线对我也有效,谢谢!
出于调试目的,我发现完全使用开发者页面上提供的代码fb很有帮助:
http://developers.facebook.com/docs/authentication/
一旦你开始工作,你可以修改它以适合你自己的代码。
我不确定,但您也可以检查以确保“应用程序编辑”屏幕上的“网站网址”和“网站域名”设置正确,因为根据文档,redirect_uri必须位于同一个域中。 (这与画布/标签页网址不同。)
答案 5 :(得分:0)
我也遇到了网址问题,但解决方法却有所不同。我正在传递signedRequest
JavaScript SDK返回服务器,并使用code
值来请求访问令牌。但是,根据Facebook PHP SDK 3.1.1版本中的一些评论,JavaScript SDK会将code
与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
""
之后,对访问令牌的请求有效。
答案 6 :(得分:0)
在我的情况下,我的代码没有在IE上工作。 问题在以下一行
$user_id = $facebook->getUser();
if ($user_id)
因为某种程度上getUser函数总是返回0,所以条件总是为真。比他从无效令牌生成该错误。 好吧,我通过这样说来解决它:
if ($user_id>0)
傻傻的东西......