【问题标题】:Facebook graph API - OAuth TokenFacebook 图形 API - OAuth 令牌
【发布时间】:2011-02-11 10:33:44
【问题描述】:

我正在尝试使用新的图形 API 检索数据,但是我从 OAuth 检索的令牌似乎不起作用。

我打的电话如下;

$token = file_get_contents('https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=<app_id>&client_secret=<app secret>');

这将返回一个字符串长度为 41 的令牌。为了给您一个返回的示例,我在示例下方提供了一个示例(将所有数字转换为 0,所有大写字母转换为 'A',小写字母转换为 'a '

access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA.

我使用此访问令牌并将其附加到数据调用请求中,它似乎不是正确的令牌,因为它没有返回任何内容。我按如下方式进行数据调用;

file_get_contents('https://graph.facebook.com/<my_page's_id>/statuses?access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA.')

当我直接通过浏览器手动检索此页面时,我收到 500/内部服务器错误消息。

任何帮助将不胜感激。


更新:

我已经将方法从 file_get_contents() 更改为 curl。通过检索标头,我收到以下错误消息...

{"error":{"type":"OAuthException","message":"Missing client_id"}}

但我的帖子数组包含“client_id”?!

【问题讨论】:

  • 嗨,你还有同样的问题吗

标签: php facebook token


【解决方案1】:

不要使用 type=client_cred,这是 不是用户的访问令牌 赠款供您的应用使用。你不 需要 redirect_uri 或 code 或任何 批准获取 client_cred 类型 访问令牌。

Facebook 实施了 此时的 OAuth 2。所以没有 还支持“状态”。

但是你可以加上后缀很好 你的状态到redirect_uri, 这里要注意的重要一点是 您指定的网站网址(其中 是redirect_uri)

不应该有

问号在结尾或任何地方 在你作为客户状态的后缀, 编码与否。如果你这样做了,你会 得到可怕的“验证错误 验证码”

不要这样使用

http://www.Redirect.com?

正确的网址是http://www.Redirect.com/

希望对你有帮助。

【讨论】:

  • 这是正确的答案。您的 redirect_uri 必须以 / 结尾。感谢您告诉我们!
  • 绝对准确 100%。另外,作为评论:不要在 PHP SDK 上的 getLoginUrl() 方法的 $params 数组中使用 redirect_uri !!!你会打破它。
  • 天啊!也少了斜线。该死!
【解决方案2】:

这对我有用:-)

header('Location: https://graph.facebook.com/oauth/access_token?' . http_build_query(array(
    'client_id'     => FB_APP_ID,
    'type'          => 'client_cred',
    'client_secret' => FB_SECRET,
    'code'          => $code)));

当然你会使用 file_get_contents 并从响应中解析出令牌

【讨论】:

  • +1 type=client_cred 为我工作。该页面不会重定向到我的 redirect_uri。
  • type=client_cred 似乎会在没有用户会话的情况下向您发出令牌(如“作为应用程序进行身份验证”中所述)。它基本上表现得好像你根本没有通过代码。没有用户会话的令牌大部分都有效,但一些需要知道当前用户是谁的 API 不起作用,最值得注意的是:graph.facebook.com/me。按照此处或 facebook 的说明,我完全无法通过用户会话获得令牌。有点令人沮丧。
  • 原来 facebook 的 oauth 实现有一些与 redirect_uri 参数内容相关的古怪错误。如果您的重定向 uri 包含某些字符(例如,正确 url 编码的冒号),它将阻塞。
  • 确认Brian的评论——如果我的redirect_uri上有任何查询字符串参数,当我去获取令牌时Facebook会窒息;没有参数它工作正常。在设置 redirect_uri 参数之前,我是正确的 urlencoding 。 Facebook 可能不止一次对整个内容进行 url 解码,因此 redirect_uri 上的参数似乎是主查询字符串的一部分。
【解决方案3】:

我遇到了完全相同的问题,但事实证明问题不在于 redirect_uri 参数的编码,或者我有一个斜杠或问号,这只是我传入了两个不同的重定向 url(没有阅读规范)。

redirect_uri 仅用作重定向一次(第一次)以使用“代码”令牌重定向回依赖方。第二次,redirect_uri 被传回身份验证服务器,但这次它没有像您期望的那样使用(重定向),而是被身份验证服务器用来验证代码。服务器以 access_token 响应。

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-05#section-3.5.2

您会注意到 facebook 文档(这很糟糕)说 fetch “通过 fetching https://graph.facebook.com/oauth/access_token 将其交换为访问令牌。”

总之,我不需要对 Uri 进行编码或做任何特别的事情,只需将相同的 redirect_uri 传入两次,然后获取第二页以获取里面的 access_token。

【讨论】:

    【解决方案4】:

    您可以使用 curl 通过终端(OSX 用户)请求访问令牌:

    curl -F type=client_cred -F client_id=xxxxxxxxxxxxxxx -F client_secret=c0f88xxxxxxxxxxxxxxxxxx1b949d1b8 https://graph.facebook.com/oauth/access_token
    

    获得访问令牌后,您可以在以后的 curl 请求中使用它,通过新的图形 API 进行更改:

    向个人资料 ID 发布消息:

    curl -F 'access_token=xxxxxxxxxxxxx|mGVx50lxxxxxxxxxxxxhzC2w.'  -F 'message=Hello Likers'  -F 'id=1250000000000905'  https ://graph.facebook.com/feed
    

    【讨论】:

    • 访问令牌不会在几天后过期吗?
    • 嗨火山,我正在尝试使用这种技术发布到喜欢网页的提要,这是否可行,有什么想法吗? stackoverflow.com/questions/10419371/…
    【解决方案5】:

    请注意

    'type' => 'client_cred',

    只是一种规避下面的方法,话虽如此,上面也有效

    在用户授权您的应用程序后,我们会将用户重定向回您指定的重定向 URI,并在参数代码中使用验证字符串,该验证字符串可以交换为 oauth 访问令牌。通过获取https://graph.facebook.com/oauth/access_token 将其交换为访问令牌。传递 exact 与上一步相同的 redirect_uri:

    通过:作者:http://developers.facebook.com/docs/api 另见:http://forum.developers.facebook.net/viewtopic.php?pid=238371

    【讨论】:

    • 谢谢! exact 相同的 redirect_uri 帮助了我。 :)
    【解决方案6】:

    尝试遵循 API,即不使用 type,但添加 redirect_uricode(即使我们不需要它):

    $token = file_get_contents('https://graph.facebook.com/oauth/access_token?client_id=<app_id>&client_secret=<app secret>&redirect_uri=<url>&code=<code>');
    

    【讨论】:

      【解决方案7】:

      也许你的问题已经解决了,但我还没有找到你接受的答案,也许这个答案可以帮助那些面临类似问题的人

      首先我们必须创建我们的应用程序实例。

      $facebook = new Facebook(array(
        'appId' => '149865361795547',
        'secret' => 'ee827a8df6202e1857b3fc28f3185a61',
        'cookie' => true,
      )); 
      

      轻松获取access_token

      $token = $facebook->getAccessToken();
      

      根据您的问题获取页面状态

      $response = $facebook->api($pageID . '/feed','get',$token);
      

      谢谢..

      【讨论】:

        【解决方案8】:

        确保您已对查询参数进行了 url 编码,您的查询参数实际上应该是:

        000000000000%7CAaaAaaAaaAAaAaaaaAaaAa0aaAA
        

        注意:type 参数似乎也是必需的,如果没有它,您还会收到 500 错误消息:

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

        而不是您收到的带有其他缺失参数的消息。看不到the documentation中提到的那个。

        【讨论】:

        • 什么时候需要类型参数。它包含在 $token = file_get_contents(...)
        • 哦,抱歉,这是给自己的提示——您的访问令牌部分已经有了它
        • 嗨,我收到以下错误:{“错误”:{“类型”:“OAuthException”,“消息”:“缺少redirect_uri参数。”重定向 url 可能有什么问题?我希望我给出的一切都是正确的。
        【解决方案9】:

        如果您的连接 URL 不是重定向 URI 的基础,您也会收到此错误。例如

        Connect URL: http://www.example.com/fb/connect/
        
        Redirect URI: http://www.example.com/fb/connect/redirect
        

        我遇到了一个问题,我的重定向 URI 与连接 URL 相同,但我忘记了重定向 URI 上的尾随 /,因此 FB 将它们视为不同并且验证失败。

        【讨论】:

          【解决方案10】:

          很抱歉在旧问题中发帖。 由于最近fb访问的变化。 我有这段代码工作,并认为我会为其他需要帮助的人发帖。 此方法适用于 jQuery ajax,并消除了 facebook 中给出的 redirect_uri 示例。

          $ch = curl_init("https://graph.facebook.com/oauth/access_token?client_id=INSERT_YOUR_APP_ID_HERE&client_secret=INSERT_YOUR_APP_SECRET_HERE&grant_type=client_credentials");
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
          curl_setopt($ch, CURLOPT_TIMEOUT_MS, 30000);
          $data = curl_exec($ch);
          $curl_errno = curl_errno($ch);
          $curl_error = curl_error($ch);
          curl_close($ch);
          
          if ($curl_errno > 0) 
          {
                  echo "cURL Error ($curl_errno): $curl_error\n";
          } 
          else 
          {
              echo $data;
          }
          

          输出一个公开可用的 access_token 以显示给非 facebook 用户。即通过网站图形 api 的 facebook 页面提要墙。 access_token=191648007534048|eVilnMh585rlQLZLvBAmqM6s-1g

          【讨论】:

            【解决方案11】:

            您需要输入一个实际值而不是 和一个秘密值。 该代码是您需要生成的唯一值,然后您提供的重定向 URL 将验证该代码是否正确。

            【讨论】:

            • 亲爱的他实际上可能不想在这里显示他的应用程序 ID 这就是他写 的原因
            猜你喜欢
            • 2012-04-22
            • 1970-01-01
            • 2011-02-18
            • 1970-01-01
            • 2016-04-26
            • 2019-04-28
            • 1970-01-01
            • 2012-01-18
            • 2011-11-06
            相关资源
            最近更新 更多