我正在构建一个将朋友数据导入本地数据库的应用程序,它运行正常。
我正在尝试创建一个由每日cron运行的脚本,该脚本将遍历本地数据库中的用户配置文件并更新好友数据。
我正在使用PHP SDK。
我启用了depreacte_offline_access标志。
这是否意味着访问令牌将在60天后自动过期,还是我还需要做其他事情?
如果用户在同一浏览器中退出应用程序或Facebook,我仍然可以从cron脚本中检索配置文件数据吗?
我认为我需要做的就是通过以下方式检索访问令牌:
$access_token = $facebook->getAccessToken();
然后将其存储在数据库中,然后使用以下命令设置访问令牌:
$facebook->setAccessToken($new_access_token);
然后用
来修复个人资料$facebook->getUser('/me');
另外,如何查看访问令牌的到期日期?
下面是一个迭代和检索配置文件的脚本,但是如果我在浏览器中运行它只适用于当前登录的用户,或者我得到异常“OAuthException:错误验证访问令牌:会话无效,因为用户退出了。“
<?php
require_once(THEME_INCLUDES_PATH . 'facebook.php');
$config = array();
$config['appId'] = APP_ID;
$config['secret'] = APP_SECRET;
$config['fileUpload'] = false; // optional
$facebook = new Facebook($config);
$sql = "SELECT `access_token` FROM `fb_user`";
$result = $db1->db_query($sql);
while($details = $db1->db_fetch_array($result)){
if($details['access_token']){
$facebook->setAccessToken($details['access_token']);
$fb_user = $facebook->getUser('/me');
if($fb_user){
try {
$fb_profile = $facebook->api('/me');
print_r( $fb_profile);
}
catch (FacebookApiException $e){
echo $e;
$fb_user = false;
}
}
}
}
?>
答案 0 :(得分:0)
你现在无法做出你想要的事情,因为offline_access被弃用了。
这个想法是,当用户实际与您的应用程序进行交互时,您的应用程序只能访问用户数据。 访问令牌有效期约为60天(具体取决于您的获取方式),但由于各种原因(例如用户删除您的应用,更改密码等等),它可能会失效。
当发生这种情况或者到期日期到来时,除了用户重新启动您的应用程序然后您可以获得新令牌或扩展您的令牌之外,您无法为获取新令牌做任何事情。
当用户实际与您的应用进行互动时,您必须更新所有数据。
在official post about the deprecation of the offline_access中说:
用户必须先访问您的应用程序才能获得 有效的“授权代码”,以便能够使服务器端OAuth 重拨。应用程序将无法设置后台/ cron作业 尝试自动延长到期时间,因为 “授权代码”是短暂的,并且已经过期。
官方帖子:Removal of offline_access Permission描述了一个扩展有效访问令牌的新端点,在以下两种情况之一中:如果应用从client-side flow获得令牌或带有已签名的请求:
使用下面的新端点,您将能够扩展 现有的有效access_token的到期时间。如果 access_token最初是从客户端OAuth调用生成的 通过signed_request,端点实际上将返回一个新的 的access_token。
它还声明:
如果access_token是从服务器端OAuth调用生成的,那么 结果access_token将有更长的到期时间。
所以我建议使用server-side flow来生成访问令牌很简单。
对于令牌无效事件的列表,它们没有完整列表,但您可以在同一页面中找到有关它的信息:
处理过期的令牌,用户密码更改,已卸载的应用和 用户注销
无论您的应用是否请求了offline_access权限,都是应用 应该在以下情况下优雅地处理过期的访问令牌 用户更改其密码,取消对应用程序的授权或注销。更多 这些案例的信息包括一个简单的代码解决方案 可以在此blog post中找到统一的用户体验。