Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP SDK扩展Facebook用户访问令牌?_Facebook_Facebook Php Sdk_Facebook Apps_Facebook Access Token - Fatal编程技术网

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

如何使用PHP SDK扩展Facebook用户访问令牌?,facebook,facebook-php-sdk,facebook-apps,facebook-access-token,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->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”。我相信我正在正确的轨道上解决这个问题,是吗?

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

  • FB用户登录后进入您的站点,您可以通过Javascript SDK中的客户端流为他们获取一个短期令牌,或者通过PHP或其他SDK的服务器端流为他们获取一个长期令牌(看起来您已经在做第一个了)
  • 如果它是一个短期令牌,则扩展它并通过API调用获取一个长期令牌以交换令牌(看起来您也在这样做)
  • 将长寿命令牌保存到数据库(不确定是否正在执行此操作)
  • 当用户在其他时间返回到您的应用程序,通过您自己的登录系统登录到您的应用程序,但未登录到Facebook时,您可以在->setAccessToken()中使用数据库中的缓存令牌,然后代表他们调用Facebook API
  • 我认为第四步是你的问题;我怀疑你看到的是用户已从Facebook注销,并再次通过Facebook身份验证过程发送他们,而不是让他们通过你自己的登录机制登录到你的应用程序,并重用你以前存储的令牌


    这很好,但在这种情况下,您不需要存储代币,您可以“实时”完成这些操作,并要求您的用户仍然登录Facebook以获取新的“实时”令牌,而不是缓存您在上次访问应用程序时获得的令牌。

    仅供参考,因为我在过去45分钟内一直在使用访问令牌。通过facebook的文档:

    这似乎有点过时,我可以手动扩展我现有的短期访问令牌,方法是: ?
    客户端id=应用程序id& 客户端密码=应用程序密码& grant\U type=fb\U交换\U令牌&
    fb_exchange_token=现有_ACCESS_token

    您的一些问题没有太大意义-如果正确扩展,该令牌应保持有效约60天,到期时间应在令牌扩展端点的响应中-您将扩展令牌存储在何处?你确定你对同一个用户使用了相同的令牌,并且没有在没有Facebook cookies设置的情况下意外地在PHP代码中调用getAccessToken()?好吧,谢谢你的观察,我将尝试为我的问题增加更多的意义。我知道扩展令牌应该在很长一段时间内保持有效。我将Facebook用户访问令牌存储在与该用户关联的数据库中,因此,是的,我确信我正在为同一用户使用相同的访问令牌。我相信响应中应该包含过期时间,但我得到的响应为null,因此我认为有问题。我的问题是:如果参数正确,我的代码是否工作正常(扩展令牌并返回扩展令牌)?当您扩展从Javascript SDK接收到的短期令牌(1-2小时有效期)时,您应该会收到一个包含更新令牌及其到期日的响应或一条错误消息,如果您收到null,您可能会在某个地方默默地忽略错误。您不能扩展使用服务器端流创建的代码,也不能扩展已交换的令牌,以防您尝试这样做。您需要用户在登录FB时返回。总的来说,您应该能够获取并存储令牌,然后在用户返回(
    $facebook->setAccessToken()
    )我正在使用PHP SDK时使用该令牌引导SDK。该用户在我的测试中登录到Facebook,并且已经拥有有效的Facebook用户访问令牌。我只是试图扩展它,但收效甚微。我不是在默默地忽略错误。而且,我也不太明白这是怎么回事。如果用户没有登录Facebook,那么他必须登录吗?我读到Facebook用户访问令牌是一个临时密码。那么,如果它没有过期,那么如果我们已经有了临时密码,用户为什么要登录Facebook呢?Facebook文档也帮不了什么忙。谢谢你的回答。与此同时,我在我们的SDK版本中发现了一些bug,可能是同事的一些黑客行为。这些问题阻碍了网站对Facebook的正确行为。因此,它很可能是一个本地错误。然而,令牌扩展目前处于停用状态,因为即使使用短期令牌,我们也会遇到问题。我会整理这些错误,然后回来提供更多信息。再次感谢。谢谢,这很有趣。