15

基本问题:即使用户不在,我希望我的应用程序能够调用有关授权用户的 Facebook 图形 api。

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

这是我已经知道的:

  • 添加offline_access到范围参数是旧方法,它不再有效。
  • 新方法是使用“长期”访问令牌,描述这里。这些持续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

4 回答 4

29

我终于自己弄清楚了。答案是相当反高潮的。似乎新创建的应用程序会自动获得 60 天的访问令牌。我不确定这是否取决于在应用程序设置的“迁移”部分中启用“depricate offline_access”设置。让它保持安全。

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

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

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

于 2012-06-06T20:22:39.333 回答
22

在上一个 Facebook PHP SDK 3.2.0 中,您有一个setExtendedAccessToken() 必须在之前调用的新函数getAccessToken();

像这样:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days
$access_token = $facebook->getAccessToken();
于 2012-08-20T19:24:48.273 回答
12

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

我在使用 New Endpoint 时遇到了相同的 HTTP/1.1 400 Bad Request 错误,问题是如果你复制 Facebook 给你的代码并将其粘贴到你的应用程序中,参数之间实际上有空格,这意味着有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;
于 2012-10-29T01:00:14.830 回答
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
}
于 2019-09-30T21:43:13.190 回答