基本问题:我希望我的应用能够在用户不在的情况下拨打有关授权用户的Facebook图形API。
例如,我希望用户(A)授权该应用,之后我希望用户(B)能够使用该应用查看有关用户(A)的朋友的信息。具体来说:“工作”字段。是的,我正在请求这些扩展权限(user_work_history
,friends_work_history
等)。目前,我的应用可以访问已登录用户的朋友工作历史记录,但不能访问该应用的其他用户的任何朋友的工作历史记录。
这就是我所知道的:
offline_access
添加到scope参数是旧的方法
不再有效。 我需要交换普通的访问令牌来获取新的扩展令牌。 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没有完整记录,我找不到任何有关如何工作的示例。
答案 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
}