【问题标题】:Facebook access_token invalid?Facebook access_token 无效?
【发布时间】:2011-02-11 22:36:03
【问题描述】:

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

我已经完成了这些步骤,在 /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

【问题讨论】:

  • access_token 在我看来并不完整。它们通常比您显示的要长得多。也许您从 URL 解析 access_token 的代码有问题?

标签: facebook oauth


【解决方案1】:

使用 Facebook 应用程序的令牌时

如果您使用 me 别名,如 https://graph.facebook.com/me/,但您的令牌是为 Facebook 应用程序获取的,那么“我”不再是你了 - 它是应用程序,或者也许没有。无论如何,这不是应用程序与自身交互的意图。

在这种情况下,您将希望通过应用与您的个人用户帐户进行交互。您需要做的(在向应用程序授予它在 UI 中请求的权限后)是找到您的 facebook 用户 ID # 并将其放在“我”的位置以访问您自己的信息。例如Mark Zuckerberg 的 Facebook 用户 ID 是 4,所以他是 https://graph.facebook.com/4/

别名 me 仅适用于您本人!有时在编写 facebook 时很难记住当前用户是谁(即您、页面、应用程序等),因为我们大部分时间都习惯于使用 facebook UI。从编程的角度来看,这取决于获得的令牌代表什么。

Ben Biddington | Facebook Graph API — getting access tokens 是一篇总是能帮助纠正我的好博文。

【讨论】:

  • 其实不应该。通过 id 获取信息是一种公共方法,即使没有正确的用户连接到 FB,它也可以使用 - 只需尝试在没有身份验证的情况下调用此方法 - 它会返回正确的用户信息。通过传递“我”,您可以确保 Facebook 已将您识别为 FB 用户。
【解决方案2】:

这里也一样。我跟着 Ben Biddington 的blog 获取了访问令牌。尝试使用时出现同样的错误。 Facebook 的 OAuth 实现并不完全遵循规范,只要文档清楚,我就可以接受,这显然不是这里的情况。另外,如果用户 ID 和用户名与访问令牌一起返回,那就太好了。

【讨论】:

  • 更新,看起来他们解决了问题。不要添加类型参数。还要确保在进行 authroize 和 access_token 调用时 redirect_uri 是相同的。
  • 最初我想针对他们的 OAuth(以及 Twitter)进行自己的实现以实现控制和性能,但开始重新考虑。不同的提供商(例如 twitter 和 facebook)提供的实现略有不同,最重要的是,oauth1/oauth2/ssl 和新的社交功能需要付出巨大努力才能跟上变化和新事物。对于 Facebook,只需使用他们的 Social Gaph Javascript API,对于 twitter,只需使用 @Anywhere api。页面加载可能会有一些开销,但在大多数情况下应该是可以接受的。我可以睡得更好。
  • 赞成“在进行 authroize 和 access_token 调用时确保 redirect_uri 相同”的评论。这解决了我的问题。终于可以停止拔我的头发了。 “type=client_cred”只会让事情变得更糟。
  • 对redirect_uri 相同的投赞成票。为什么这在文档或示例中没有其他地方超出我的能力范围,但我只花了 4 个小时调试它,这是唯一有效的方法。
【解决方案3】:

只是澄清一下——在你打电话之后

https://graph.facebook.com/oauth/authorize?

您应该收到一个代码,连同您的 CLIENT_ID 和 CLIENT_SECRET(假设您已注册您的应用程序)可以在

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

如果这确实是您通过 ACCESS_TOKEN 获得的方式,那么您应该可以请求

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

【讨论】:

  • 这就是他的要求,他从服务器收到 QueryParseException 错误!
  • 正确,这就是我获取 access_token 的方式 - 但是当我尝试点击 graph.facebook.com/me/?access_token=foo 时,我得到了 QueryParseException ...另外,我得到的 access_token 没有 &exp 参数,可能有什么关系...
  • 我在这里苦苦挣扎,如果您找到解决方案,请随时告诉我。
  • 我终于得到了一个不同的 access_token,但它仍然被 Facebook 认为是无效的......
  • 您发送的查询字符串是 url 编码的吗?那也需要,您是如何设法获得差异 access_token 的?
【解决方案4】:

添加类型参数返回应用程序级别的auth_token,因此最好省略它。在无数次尝试和组合之后,对我有用的是在对/oath/access_token 的调用中使用与在对/oath/authorize 的调用中使用的相同的redirect_url 参数。
因此,代表某人授权您的应用的完整顺序是:

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"

【讨论】:

    【解决方案5】:

    我遇到了完全相同的问题。我做了几件事来解决它:

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

    【讨论】:

      【解决方案6】:

      我想指出 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】:

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

        这似乎有点奇怪,但我只是在规范/说明中的某个地方漏掉了一个词。不过,我确实为此损失了两个小时。

        【讨论】:

          【解决方案8】:

          我也遇到了同样的问题,但是去掉type=client_cred 并确保在进行授权时redirect_uri 参数是相同的,access_token call 解决了这个问题。

          【讨论】:

            【解决方案9】:

            我只在 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'];
            

            【讨论】:

              猜你喜欢
              • 2011-10-16
              • 1970-01-01
              • 1970-01-01
              • 2011-10-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-07
              相关资源
              最近更新 更多