如何使用PHP SDK扩展Facebook用户访问令牌?

时间:2013-07-15 23:08:38

标签: facebook facebook-php-sdk facebook-apps facebook-access-token

我有这段代码:

$facebook->api("/oauth/access_token?grant_type=fb_exchange_token&client_id=".$facebook->getAppId()."&client_secret=".$facebook->getAppSecret()."&fb_exchange_token=".$user->getFacebookAccessToken());

它不会抛出任何异常,但会返回null。我试图将短暂的Facebook用户访问令牌扩展为长期存在的Facebook用户访问令牌。但是,在我生成新令牌并在新令牌仍处于活动状态时调用此请求之后,我已经等了几个小时并启动了一个浏览器,我没有使用我的Facebook帐户登录。然后我登录了一个测试用户(到应用程序,而不是Facebook),但遗憾的是它指示我登录Facebook,这意味着Facebook用户访问令牌在某种程度上无效。

我的工作基于here找到的文档。

那么,有人可以告诉我应该如何发送请求,以便Facebook真正延长令牌的生命周期?此外,我不知道如何确定我是否已成功延长Facebook用户访问令牌的生命周期。 (我不是Facebook的粉丝,至少可以说,我也是Facebook API的新手。)

谢谢,伙计们。

编辑: 我已阅读this article并将setExtendedAccessToken方法复制到我的类中,并进行了一些修改以支持我的逻辑。现在,试图延长用户Facebook访问令牌生命周期的代码如下:

$facebook->setExtendedAccessToken($user->getFacebookAccessToken());

现在它返回一个包含两个元素的数组,即令牌和到期日期。到期日为“5174078”。我相信我在正确的轨道上解决这个问题,是吗?

2 个答案:

答案 0 :(得分:4)

以下是我认为您应该做的事情:

  1. 登录的FB用户来到您的站点,您可以通过Javascript SDK中的客户端流程获取一个短期令牌,或者通过服务器端流程使用PHP或者一些获得长期令牌其他SDK (看起来你已经在做第一个了)
  2. 如果它是一个短期令牌,请通过API调用扩展它并获得一个长期存在的令牌来交换令牌(看起来你也是这样做的)
  3. 将长期存在的令牌保存到您的数据库(不确定您是否这样做)
  4. 当用户在其他位置返回您的应用时,通过您自己的登录系统登录您的应用,但未登录到Facebook,您使用数据库中的缓存令牌 - > gt; setAccessToken()然后代表他们调用Facebook API
  5. 我认为第4步是你的问题;我怀疑你看到用户已退出Facebook并再次通过Facebook身份验证过程发送,而不是让他们通过您自己的登录机制登录您的应用程序,并重新使用您之前存储的令牌。

    这很好,但是在这种情况下你不需要存储令牌,你可以全部“直播”并要求你的用户仍然登录Facebook以获取新的令牌“直播”而不是缓存您在上次访问应用时获得的令牌。

答案 1 :(得分:1)

就像一个FYI原因一样,我在过去的45分钟内一直在使用访问令牌。通过facebook的文档: https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

似乎有点过时,我能够手动扩展我现有的短期访问令牌: 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