4

我有这个代码:

$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 用户访问令牌以某种方式无效。

我正在根据此处找到的文档工作。

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

多谢你们。

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

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

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

4

2 回答 2

4

这是我认为你应该做的:

  1. 登录后的 FB 用户访问您的站点,您可以通过 Javascript SDK 中的客户端流程为他们获得一个短期令牌,或者通过 PHP 或其他一些 SDK 的服务器端流程获得一个长期令牌(看来你已经在做第一个了)
  2. 如果它是一个短期令牌,请扩展它并通过 API 调用获取一个长期令牌以交换令牌(看来您也在这样做)
  3. 将长期存在的令牌保存到您的数据库(不确定您是否正在这样做)
  4. 当用户在其他时间返回您的应用程序时,通过您自己的登录系统登录到您的应用程序,但未登录到 Facebook,您使用 ->setAccessToken() 中数据库中的缓存令牌,然后进行调用代表他们访问 Facebook API

我认为第 4 步是你的问题;我怀疑您看到用户已从 Facebook 注销并再次通过 Facebook 身份验证流程发送他们,而不是让他们通过您自己的登录机制登录到您的应用程序,并重用您之前存储的令牌。

这很好,但在这种情况下,您无需存储令牌,您可以“实时”执行此操作,并要求您的用户仍登录 Facebook 以获取“实时”新令牌,而不是缓存您在他们之前访问您的应用程序时获得的令牌。

于 2013-07-16T15:43:57.753 回答
1

正如一个仅供参考的原因,我在过去的 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

于 2013-12-16T17:27:13.213 回答