代码之家  ›  专栏  ›  技术社区  ›  Simon R

Facebook图形API-OAuth令牌

  •  26
  • Simon R  · 技术社区  · 16 年前

    我正在尝试使用新的图形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"}}
    

    但我的post数组包括“client_id”?!

    11 回复  |  直到 14 年前
        1
  •  24
  •   PrateekSaluja    15 年前

    不要使用type=client-cred,这是 不是用户 应用程序使用的授权。你没有 需要重定向URI或代码或任何 批准获取客户信用类型 访问令牌。

    Facebook实施了 此时为OAuth 2。所以没有 对“国家”的支持还没有。

    但你能加后缀真是太好了 你的状态到重定向的 这里需要注意的一点是 您指定的网站URL(其中 是重定向的URI)

    不应该有

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

    别那样用

    http://www.Redirect.com?

    正确的URL是 http://www.Redirect.com/

    希望有帮助。

        2
  •  16
  •   typeoneerror    15 年前

    这对我很有用

    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)));
    

    当然,您将使用文件获取内容,并从响应中解析令牌。

        3
  •  8
  •   Francis Shanahan    15 年前

    我遇到了完全相同的问题,但结果发现问题不是redirect-ouri参数的编码,或者我有一个尾随斜杠或问号,只是我传入了两个不同的重定向URL(当时没有阅读规范)。

    重定向URI仅用作一次重定向(第一次),以使用“code”令牌重定向回依赖方。第二次,重定向的URI被传递回auth服务器,但这次它并没有像您期望的那样使用(重定向),而是被authentication服务器用来验证代码。服务器用访问标记响应。

    http://tools.ietf.org/html/draft-ietf-oauth-v2-05#section-3.5.2

    你会注意到facebook文档(很糟糕)说 取来 “将其交换为访问令牌 正在提取 https://graph.facebook.com/oauth/access_token

    总之,我不需要对URI进行编码或做任何特殊的事情,只需在同一个重定向中传递两次\u uri,以及 取来 第二页获取访问标记。

        4
  •  6
  •   Michael Mrozek    15 年前

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

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

    一旦您有了访问令牌,您就可以在以后的curl请求中使用它,通过新的graph api进行更改:

    将消息发送到配置文件ID:

    curl -F 'access_token=xxxxxxxxxxxxx|mGVx50lxxxxxxxxxxxxhzC2w.'  -F 'message=Hello Likers'  -F 'id=1250000000000905'  https ://graph.facebook.com/feed
    
        5
  •  3
  •   kÍ©eÍ£mÍ®pÍ¥ Í©    14 年前

    请注意

    '类型'=>'客户信用',

    只是一种绕过下面的方法,尽管如此,上面的方法也是有效的

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

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

        6
  •  2
  •   Michael Mrozek    15 年前

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

    $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
  •  2
  •   Danish Iqbal    14 年前

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

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

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

    轻松获得 访问\令牌

    $token = $facebook->getAccessToken();
    

    获取问题中的页面状态

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

    谢谢。。

        8
  •  0
  •   user242766    16 年前

    确保您的查询参数是URL编码的,您的查询参数应该是:

    000000000000%7CAaaAaaAaaAAaAaaaaAaaAa0aaAA
    

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

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

    而不是您收到的带有其他缺少参数的消息。看不到 the documentation .

        9
  •  0
  •   Jeremy Raymond    16 年前

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

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

    我遇到了一个问题,我的重定向URI与连接URL相同,但我忘记了重定向URI的尾随/上的内容,所以FB将它们视为不同的内容,从而导致身份验证失败。

        10
  •  0
  •   Damien Keitel    14 年前

    很抱歉在旧问题中发帖。 因为最近的FB访问发生了变化。 我有这个代码,我想我会为其他需要帮助的人发帖。 这个方法与jquery-ajax很好地配合使用,并从facebook中消除了给定的重定向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;
    }
    

    向非Facebook用户输出公开可用的访问令牌。即通过图形API为网站提供Facebook页面订阅墙。 访问令牌=191648007534048 evilnmh585rlqlzlvbamqm6s-1g

        11
  •  -6
  •   Yosi Oren    15 年前

    您需要输入实际值,而不是<app_id>和机密值。 代码是您需要生成的唯一值,您提供的重定向URL随后将验证代码是否正确。

    推荐文章