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

eme*_*his 15 facebook facebook-graph-api

基本问题:我希望我的应用程序即使在用户离开时也可以拨打关于授权用户的Facebook图形API.

例如,我希望用户(A)授权应用程序,然后我希望用户(B)能够使用该应用程序查看有关用户(A)的朋友的信息.具体来说:"工作"字段.是的,我请求那些扩展权限(user_work_history,friends_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();
Run Code Online (Sandbox Code Playgroud)

有这样的事吗?:

$facebook->getExtendedAccessToken();
Run Code Online (Sandbox Code Playgroud)

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

$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}"
    );
Run Code Online (Sandbox Code Playgroud)

我试过了它并没有用.我收到此错误:

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 /...
Run Code Online (Sandbox Code Playgroud)

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

eme*_*his 29

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

所以在编写本文时,您可以使用PHP SDK,如下所示: $facebook->getAccessToken();

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

还有一两件事,要获得长期的访问令牌使用PHP SDK,你应该叫$facebook->setExtendedAccessToken();$facebook->getAccessToken();

  • 我对此感到生气.我有一个疑问:你这样做是因为你想要访问用户档案,即使他没有登录,对吧?但是,当"延长的"60天持久令牌到期时会发生什么?用户是否需要重新认证..?不是很好的体验,我想...... (2认同)

cmi*_*tti 22

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

像这样:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days
$access_token = $facebook->getAccessToken();
Run Code Online (Sandbox Code Playgroud)


Dan*_*ari 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;
Run Code Online (Sandbox Code Playgroud)