【问题标题】:Access user profile from cron从 cron 访问用户配置文件
【发布时间】:2012-04-14 18:12:46
【问题描述】:

我正在构建一个将朋友数据导入本地数据库的应用程序,它运行良好。

我正在尝试创建一个由每日 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;
            }
        }
    }
}
?>

【问题讨论】:

    标签: php facebook sdk cron access-token


    【解决方案1】:

    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 调用生成的,或者 通过签名请求,端点实际上将返回一个新的 访问令牌。

    它还指出:

    如果 access_token 是从服务器端 OAuth 调用生成的,则 生成的 access_token 将有更长的过期时间。

    所以我的建议很简单,就是使用server-side flow 来生成访问令牌。

    至于令牌失效事件列表,它们没有完整列表,但您可以在同一页面中找到有关它的信息:

    处理过期令牌、用户密码更改、卸载的应用程序和 用户注销

    无论您的应用是否请求了offline_access 权限,应用 在以下情况下应该优雅地处理过期的访问令牌 用户更改密码、取消对应用程序的授权或注销。更多的 有关这些案例的信息,包括一个简单的代码解决方案 可以在此blog post 中找到统一的用户体验。

    您可以查看此文档:Handling Invalid and Expired Access Tokens

    【讨论】:

    • 基本上是对的,但是token可能会因为其他原因失效(我在回答中提到过)。
    • 我从中了解到的是,一旦用户从站点获得了有效的访问令牌,cron 脚本将能够访问他们的个人资料,但不会更新访问令牌的到期时间。所以主要问题是启用offline_access标志似乎不会自动使到期日期持续60天,我不确定我需要做什么?另一件事是似乎没有完整记录的可能导致访问令牌失效的事件列表。
    • 不要删除您的 cmets,这只会让以后阅读它的人感到困惑。我用更多信息编辑了我的答案。
    • 我通过在 facebook 中删除我的应用并再次授权,解决了令牌在 2 小时内而不是 60 天内到期的问题。
    猜你喜欢
    • 2017-04-25
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多