Facebook access_token无效?

时间:2010-04-24 18:59:59

标签: facebook oauth

我正在尝试使用最近发布的新的Graph API Facebook,但我似乎无法让它正常工作。

我已经完成了这些步骤,在/ authorize调用之后,我收到了access_token:

access_token=109002049121898|nhKwSTJVPbUZ5JYyIH3opCBQMf8.

当我尝试使用该令牌时,我得到:

{
   "error": {
      "type": "QueryParseException",
      "message": "An active access token must be used to query information about the current user."
   }
}

我也很难过......

-AC

9 个答案:

答案 0 :(得分:12)

使用Facebook应用程序的令牌时

如果您使用me中的https://graph.facebook.com/me/别名,但是您的代币是针对 Facebook应用获取的,则“我”不再是您了 - 它是应用程序或可能没有。无论如何,这不是你打算让应用程序与自己进行交互。

在这种情况下,您需要通过应用与个人用户帐户进行互动。您需要做什么(在应用程序向用户提出要求时在UI中请求的权限之后)找到您的facebook用户ID#并将其替换为“我”来访问您自己的信息。例如Mark Zuckerberg的facebook用户名是4,所以他是https://graph.facebook.com/4/

别名me仅在你是你的情况下才有效!有时很难记住当前用户在编程Facebook时是谁(即你,页面,应用程序等),因为我们习惯于在大多数时候习惯使用facebook UI。从编程的角度来看,它取决于所获得的令牌代表什么。

一篇很有帮助纠正我的博客文章是Ben Biddington | Facebook Graph API — getting access tokens

答案 1 :(得分:7)

这里也是一样的。我跟随Ben Biddington的blog获取访问令牌。尝试使用它时出现相同的错误。 Facebook的OAuth实现并没有完全遵循规范,只要文档清晰,我就可以了,显然​​情况并非如此。如果使用访问令牌返回用户标识和用户名,那将会很好。

答案 2 :(得分:4)

在您致电

之后澄清一下
https://graph.facebook.com/oauth/authorize?

您应该收到一个CODE,它与您的CLIENT_ID和CLIENT_SECRET(假设您已注册您的应用程序)一起可以在

交换access_token
https://graph.facebook.com/oauth/access_token?

如果您的ACCESS_TOKEN确实如此,那么您应该可以请求

https://graph.facebook.com/me/

答案 3 :(得分:2)

添加类型参数会返回应用程序级别的auth_token,因此最好是OMIT。经过无数次尝试和组合后,对我来说,在redirect_url的调用中使用的/oath/access_token参数与调用/oath/authorize时使用的参数相同。 因此,代表某人授权您的应用程序的完整序列是:

1。致电或重定向到:

"https://graph.facebook.com/oauth/authorize?client_id=" + my_clientId + "&scope=publish_stream,offline_access,manage_pages" + "&redirect_uri=" + "http://my_redirect_url?blah" 

2。在位于上方return_url的页面中,向此网址发出请求或其他任何内容:

"https://graph.facebook.com/oauth/access_token?client_id=" + client_id + "&client_secret=" + secret + "&code=" + Request.QueryString["code"] + "&redirect_uri=" + "http://my_redirect_url?blah"

答案 4 :(得分:1)

我在IE8中只有同样的问题。 我的解决方案是在API请求中发送access_token。 像这样:

FB.api('/me/friends?access_token=<YOUR TOKEN>

我通过PHP获得了我的令牌:

// Create our Application instance.
$facebook = new Facebook(array(
    'appId'  => '<API_ID>',
    'secret' => '<SECRET>',
    'cookie' => false,
));

$session = $facebook->getSession();
$token = $session['access_token'];

答案 5 :(得分:0)

我一直有同样的问题。我已经做了几件事来解决它:

  1. 首先在浏览器中尝试全部以确保每个阶段的网址都正确
  2. 确保重定向网址相同,而不仅仅是等效网址。参数顺序相同,编码相同
  3. 请勿使用type = client_cred或其他任何内容
  4. 对redirect_url中的任何&符号进行编码(但不包括网址的其余部分),例如http://example.com/fb?foo=234%26bar=567。这个问题引起了我最多的问题。当回调页面运行时,只包含第一个&符号之前的u​​rl,因为&符号被假定为graph.facebook.com的url的一部分,不是 redirect_url的一部分。然后我从查询字符串中获取值以放入第二次调用的redirect_url,但它们不在那里。一旦我编码了&符号,它们就会正确显示。
  5. 您编码的查询字符串参数中没有任何空值(例如?foo =%26bar = 123)

答案 6 :(得分:0)

我想指出Ben Biddington的博客上有什么说法,以及我在初始问题中查看“格式错误”的access_token时注意到的内容。其他人在这个帖子中说过类似的事情,但我想要明确。

令牌实际上并不是格式错误,而是一个允许您代表APP而不是用户执行操作的令牌。如果您想要获取应用的所有用户,或者查看应用的见解等,这是您使用的令牌,请求通常来自您的服务器,而不是客户端。通过使用type = client_cred参数获得此类型的令牌。如果您想代表用户执行操作,请不要指定type = client_cred,并确保在调用http://graph.facebook.com/oauth/access_token时指定以下参数:

'client_id' => APP_ID
'redirect_uri' => REDIRECT_URI
'client_secret' => APP_SECRET
'code' => $_GET['code']

我把它写成PHP数组的键值对,但我认为你明白了。使用以下参数初始调用http://graph.facebook.com/oauth/authorize后,将获得代码GET值:

'client_id' => APP_ID
'redirect_uri' => "http://your.connect.url/some/endpoint"

我希望这有帮助! Facebook文档所说的,但不能说得好,是获取access_token是一个双请求过程。

答案 7 :(得分:0)

我实际上注意到,如果你的返回uri最后没有斜线你就会遇到问题。我目前正在浏览器中测试并且return_uri = https://mydomain.com不起作用但return_uri = https://mydomain.com/确实有效。如果我使用第一个,我会收到“验证验证码的错误。”

这看起来有点奇怪,但我只是错过了spec / instructions中的一个字。虽然失去了我生命中的两个小时。

答案 8 :(得分:0)

我遇到了同样的问题,但是在删除type=client_cred并确保redirect_uri参数在进行授权和access_token call修复问题时是相同的。