我正在尝试找到一种方法,以使用OAuth授权后保持与Facebook API的连接,但遇到了问题。 我不希望我的应用程序的用户每次想使用我的应用程序时都必须通过Facebook登录。

在用户通过facebook进行身份验证之后,我将oauth访问权限存储在数据库中,并且设置了"offline_access"权限,因此从理论上讲,这应该是可能的。

但是,我收到"Uncaught OAuthException: An active access token must be used to query information about the current user." 尝试使用存储在数据库中的已保存Oauth令牌连接到Facebook API时。

header("p3p: CP=\"ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV\""); // hack to stop facebook wierd cookie problems

//instantiate the Facebook library with the APP ID and APP SECRET
$facebook = new Facebook(array(
    'appId' => 'appid',
    'secret' => 'secretid',
    'cookie' => true
));

//Get the FB UID of the currently logged in user
$user = $facebook->getUser();

//if the user has already allowed the application, you'll be able to get his/her FB UID
if($user) { 
    //get the user's access token
    $access_token = $facebook->getAccessToken();
} else  {
    //see if authorisation already set up in DB
    $query = mysql_query("SELECT oauth_token FROM PingSocialMediaUsers WHERE oauth_provider = 'facebook' AND clientID = '$clientID'");  
    $result = mysql_fetch_row($query); 
    $access_token = $result[0];
}

if($access_token) { 

    //check permissions list
    $permissions_list = $facebook->api(
        '/me/permissions',
        'GET',
        array(
            'access_token' => $access_token
        )
    );

    //check if the permissions we need have been allowed by the user
    //if not then redirect them again to facebook's permissions page
    $permissions_needed = array('publish_stream', 'read_stream', 'offline_access');
    foreach($permissions_needed as $perm) {
        if( !isset($permissions_list['data'][0][$perm]) || $permissions_list['data'][0][$perm] != 1 ) {
            $login_url_params = array(
                'scope' => 'publish_stream,read_stream,offline_access',
                'fbconnect' =>  1,
                'display'   =>  "page",
                'next' => 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
            );
            $login_url = $facebook->getLoginUrl($login_url_params);
            header("Location: {$login_url}");
            exit();
        }
    }

    //if the user has allowed all the permissions we need,
    //get the information about the pages that he or she managers
    $accounts = $facebook->api(
        '/me',
        'GET',
        array(
            'access_token' => $access_token
        )
    );

    //add to details database
    //find the user by ID  
    if ($user != ''){
        $query = mysql_query("SELECT * FROM PingSocialMediaUsers WHERE oauth_provider = 'facebook' AND oauth_uid = '$user'");  
        $result = mysql_fetch_array($query);  

        // If does not exist add to database  
        if(empty($result)){  
            $query = mysql_query("INSERT INTO PingSocialMediaUsers (oauth_provider, clientID, oauth_uid, username, oauth_token, oauth_secret) VALUES ('facebook', $clientID, $user, '{$accounts['name']}', '$access_token', '')"); 
            $query = mysql_query("SELECT * FROM PingSocialMediaUsers WHERE id = " . mysql_insert_id());  
            $result = mysql_fetch_array($query);  
        } else {  
            //update the tokens  
            $query = mysql_query("UPDATE PingSocialMediaUsers SET oauth_token = '$access_token', oauth_secret = '' WHERE oauth_provider = 'facebook' AND oauth_uid = '$user'");  
        }   


    //save the information inside the session
    $_SESSION['_token'] = $access_token;
    $_SESSION['accounts'] = $accounts['data'];
    }
    $facebookAuth = TRUE;

===============>>#1 票数:1 已采纳

当Facebook通过您的应用程序访问令牌时,它会传递一个expires字段,根据Facebook的默认值为2小时。

还有其他因素会使access_token过期,这是您的完整详细信息

Ankur Pansari操作方法:处理过期的访问令牌

接下来,我们可以讨论offline_access ,这意味着

It Enables your app to perform authorized requests 
on behalf of the user at any time. By default, 
most access tokens expire after a short time period to ensure applications 
only make requests on behalf of the user when the are actively 
using the application. This permission makes the 
access token returned by our OAuth endpoint long-lived.

因此,这一切都意味着您必须确保始终使用有效的access_token 。有关各种权限的详细信息,请参见参考链接。

Facebook的权限

  ask by LeeTee translate from so

未解决问题?本站智能推荐:

2回复

有谁知道Facebook API访问令牌的寿命?

FB oAuth API中访问令牌的生命周期是多少? 不是扩展的离线权限,只是普通的访问令牌?
2回复

从Cookie获取访问令牌以与Facebook Graph API一起使用

假设我有一个用户登录到Facebook(Cookies保存在浏览器的缓存中),获取其访问令牌的最简单方法是什么? 我正在尝试Facebook的Graph API,我不想打扰创建一个应用程序以获取访问令牌(至少现在不是)。 如果我没记错的话,几天前我在我的浏览器上登录http://grap
3回复

页面的Facebook访问令牌

我有一个Facebook页面,我想从中获取一些东西。 第一件事是提要,根据我的阅读,它们是公开的(不需要access_token)。 但是我也想获取事件……它们不是公开的,需要access_token。 我不希望用户登录Facebook或类似的东西。 我只想从该唯一页面推送所有数据。
1回复

Facebook访问令牌过期安全性

我想将Faccbook登录信息集成到我的应用程序中,但是我首先尝试了解Facebook关于访问令牌到期的安全性概念。 1)据我了解,访问令牌的目的是提供“无状态性”。 Facebook声明访问令牌的有效期为一两个小时。 如果某人很早就窃取了访问令牌,他们将能够使用此访问令牌以受害者身份
1回复

Facebook Test用户-访问令牌

我正在尝试通过在应用程序开发人员门户上创建一些测试用户来测试我的应用程序。 当我单击测试用户旁边的链接“切换到”时,它使我退出facebook并以测试用户身份登录。 但是我注意到,开发者用户的访问令牌在注销时并未失效。 在注销的情况下访问令牌不是应该无效的吗(这是我实际以普通用户身份注销F
1回复

无法获取访问令牌

为什么会收到以下错误消息?
1回复

如何使用publish_stream发布到Facebook用户的朋友的墙上,而不是使用应用程序访问令牌发布offline_access

publish_stream的文档读取:“使您的应用程序能够将内容,评论和喜欢发布到用户的流和用户朋友的流中。通过此权限,您可以随时将内容发布到用户的订阅源,而无需offline_access。 “ 因此工作流程如下: 具有publish_stream范围的FB.login()如
1回复

具有脱机访问权限的Facebook令牌不会过期

嗨,我正在尝试生成一个具有脱机访问权限且不会过期的Facebook访问令牌。 我们目前正在使用生成令牌 https://graph.facebook.com/oauth/authorize?type=user_agent&client_id=OurAppId&redi
1回复

一旦永久弃用该权限,带有offline_access的用户访问令牌将发生什么?

当前,我们有许多具有offline_access用户令牌的用户,我们用来代表他们管理页面。 我已经阅读了《 删除offline_access指南》,并且大部分更改都很清楚,但是我们想澄清一个未知的地方。 永久弃用offline_access之后,我们将切换为使用未过期的页面access_
1回复

分配访问令牌到期原因-倾向于以页面管理员身份删除用户

我们正在看到某些奇怪的行为,原因是使用我们的应用程序的页面访问令牌即将过期的原因。 我们正在使用offline_access权限,并且在数据收集中没有遇到任何问题(限制,错误等)。 Page令牌已过期的几个用户是该页面的实际所有者。 如果令牌过期,那么奇怪的是,我们得到了一个过期原因,