Facebook PHP SDK:现在获得“long-lived”访问令牌,因为“offline_access”已被弃用

时间:2012-06-05 19:54:10

标签: facebook facebook-graph-api

基本问题:我希望我的应用能够在用户不在的情况下拨打有关授权用户的Facebook图形API。

例如,我希望用户(A)授权该应用,之后我希望用户(B)能够使用该应用查看有关用户(A)的朋友的信息。具体来说:“工作”字段。是的,我正在请求这些扩展权限(user_work_historyfriends_work_history等)。目前,我的应用可以访问已登录用户的朋友工作历史记录,但不能访问该应用的其他用户的任何朋友的工作历史记录。

这就是我所知道的:

  • offline_access添加到scope参数是旧的方法 不再有效。
  • 新的方式是“长寿”访问令牌, 描述这里。这些持续60天。
  • 我需要交换普通的访问令牌来获取新的扩展令牌。 FB文档说:

    https://graph.facebook.com/oauth/access_token
        CLIENT_ID = APP_ID&安培;     client_secret = APP_SECRET&安培;     grant_type = fb_exchange_token&安培;     fb_exchange_token = EXISTING_ACCESS_TOKEN

这是我不知道的(我希望你能告诉我): 如何使用Facebook PHP SDK获取扩展(又名“长寿”)访问令牌?目前,我的代码如下所示:

$facebook->getAccessToken();

有这样的事吗?:

$facebook->getExtendedAccessToken();

如果没有,这是我应该做的吗?

$accessToken = $facebook->getAccessToken();
$extendedAccessToken = file_get_contents("https://graph.facebook.com/oauth/access_token?             
    client_id={$appId}&
    client_secret={$secret}&
    grant_type=fb_exchange_token&
    fb_exchange_token={$accessToken}"
    );

我已经尝试过它并不起作用。我收到这个错误:

Warning: file_get_contents(https://graph.facebook.com/oauth/access_token? client_id=#######& client_secret=#########& grant_type=fb_exchange_token& fb_exchange_token=##########) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /...

如果我切换到FQL而不是图形API,它会有什么不同吗?我已多次阅读Facebook文档,但PHP sdk没有完整记录,我找不到任何有关如何工作的示例。

4 个答案:

答案 0 :(得分:29)

我终于自己想出来了。答案非常反高潮。看来新创建的应用程序会自动获得60天的访问权限。我不确定这是否依赖于在应用程序设置的“迁移”部分中启用“depricate offline_access”设置。保持安全。

因此,在撰写本文时,您可以按如下方式使用PHP SDK:$facebook->getAccessToken();

(我的应用程序没有按预期工作的原因与访问令牌的到期无关。)

还有一件事,要使用PHP SDK获取长期访问令牌,您应该在$facebook->setExtendedAccessToken();之前调用$facebook->getAccessToken();

答案 1 :(得分:22)

在上一个Facebook PHP SDK 3.2.0中,您有一个新功能setExtendedAccessToken() 您必须在getAccessToken();

之前致电

像这样:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days
$access_token = $facebook->getAccessToken();

答案 2 :(得分:10)

实际上,如果您使用服务器端呼叫,新创建的应用程序只会自动获得60天的访问令牌。如果您正在使用问题中上面显示的客户端端点,那么即使是新应用最初仍会收到短期令牌。见:https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

我在使用New Endpoint时遇到了相同的HTTP / 1.1 400错误请求错误,问题是如果你复制Facebook提供给你的代码并将其粘贴到你的应用程序中,那么params之间实际上有空格,意思是url中有不必要的空格,当传递到file_get_contents()时它不会被正确调用,即使它在浏览器中粘贴时也能正常工作。这花了我太长时间才弄明白。希望这有助于某人!这是我完整的工作代码,用于将扩展访问令牌从新端点中取出(将x替换为您的值):

$extend_url = "https://graph.facebook.com/oauth/access_token?client_id=xxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxxx&grant_type=fb_exchange_token&fb_exchange_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

$resp = file_get_contents($extend_url);

parse_str($resp,$output);

$extended_token = $output['access_token'];

echo $extended_token;

答案 3 :(得分:0)

所选答案现在已过时。以下是Facebook的说明,用于将短期令牌(前端提供)交换为长期令牌(仅限服务器):

https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/

Generate a Long-lived User or Page Access Token
You will need the following:

A valid User or Page Access Token
Your App ID
Your App Secret
Query the GET oath/access_token endpoint.

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?  
    grant_type=fb_exchange_token           
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={your-access-token}" 

Sample Response
{
  "access_token":"{long-lived-access-token}",
  "token_type": "bearer",
  "expires_in": 5183944            //The number of seconds until the token expires
}