Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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
facebook从cookie php自动重新登录_Php_Javascript_Facebook_Facebook Graph Api - Fatal编程技术网

facebook从cookie php自动重新登录

facebook从cookie php自动重新登录,php,javascript,facebook,facebook-graph-api,Php,Javascript,Facebook,Facebook Graph Api,我的网站使用Facebook connect登录,我的服务器上的会话生存期为3600 我使用(javascript)重定向到login.php,并使用login.php检索cookies(由javascript设置)来获取访问令牌 但是,如果用户空闲超过3600秒,则我的服务器上的会话将过期。($\u会话[uid]不存在。) my login.php如何检查用户是否已登录Facebook(不是我的应用程序) 我使用的解决方案是将用户重定向到我的javascript页面,facebook会自动触发

我的网站使用Facebook connect登录,我的服务器上的会话生存期为3600

我使用(javascript)重定向到login.php,并使用login.php检索cookies(由javascript设置)来获取访问令牌

但是,如果用户空闲超过3600秒,则我的服务器上的会话将过期。($\u会话[uid]不存在。) my login.php如何检查用户是否已登录Facebook(不是我的应用程序)

我使用的解决方案是将用户重定向到我的javascript页面,facebook会自动触发“onStatus函数”

我正在寻找一个解决方案,它可以通过login.php自动重新登录我的网站,如果他或她登录了Facebook(无需重定向到javascript页面)。有可能吗

javascript:

FB.init({appId: 'MY_APP_ID', status: true, cookie: true, xfbml: true});

FB.getLoginStatus(function(response) {
    onStatus(response);
    FB.Event.subscribe('auth.statusChange', onStatus);
    FB.Event.subscribe('auth.login', reloadPage);
});

function onStatus(response) {
    if (response.session) {
        window.location.href = '/login?fb';
    }
}

function reloadPage(response) {
    if (response.session) {
        window.location.href = '/login?fb';
    }
}
PHP(用于登录):


我还是一个新的FB连接和整个过程,但我想把我的2美分。我见过一些网站严格建立在用户有FB的基础上,所以他们是否登录FB适用于我提到的特定网站。我已经注意到,如果我在FB上登录并在过去与这些站点连接,那么我将自动重新登录到所述站点,如果我没有登录,则应用相同的逻辑


这就是说,我假设这意味着FB有一个可识别的cookie,可以在某处检测到,如果检测到,您可能会在脚本中使用它来让用户自动登录超过3600标记。我从twitter和linkedin了解到,他们有用户身份验证令牌,标识每个用户,这些用户最终可以存储在DB中并在以后重新使用,因此我认为您可能会希望在FB中进一步了解这一点,因为我确信FB也必须如此。在其中存储与用户关联的令牌,如果找到了前面提到的cookie,则可以在其中查找该身份验证令牌。对不起,如果这没有多大意义的话,我会在这里冒烟的。如果我在FB方面做得更好,我会尝试提供更多帮助,但我还处于了解如何与FB和非FB站点交互的最基本阶段。

在保持客户端流量的同时,可以使用Facebook PHP SDK()处理用户会话

$facebook = new Facebook(...);

// Get the User ID
$user = $facebook->getUser(); 
$user
非空表示该用户已登录Facebook并通过身份验证。你不再需要你在这里提供的PHP(
get\u facebook\u cookie
等等):它都包含在facebook PHP SDK中。对你来说应该足够了


更进一步:如果您想为该用户进行API调用

$user
非空并不意味着您拥有此用户的有效访问令牌。测试您是否拥有有效访问令牌的一种方法是尝试进行API调用:

$isvalid;

try { 
  $facebook->api('/me');
  $isvalid = true;
} catch (FacebookApiException $e) {
  $isvalid = false;
}

我已经想出了一个办法。在所有页面中创建下一页的框架

当facebook通过cookie提供的访问令牌过期时,iframe中的页面将自动刷新。 init()将为我的应用程序设置一个新的访问令牌(cookie)

在我的php文件中,只需检查首次连接的Cookie即可

fb_keepalive.html:

<div id="fb-root"></div>
<script type="text/javascript" src="https://connect.facebook.net/zh_TW/all.js"></script>
<script type="text/javascript">
FB.init({appId: 'APP_ID', status: true, cookie: true, xfbml: true});
FB.getLoginStatus(function(response) {
    onStatus(response);
});

function onStatus(response) {
    if (response.session) {
        var timestamp = new Date().getTime();
        var expires = response['session']['expires'] * 1000;
        if(expires - timestamp >= 0){
            setTimeout(function(){window.location.reload();}, expires - timestamp);
        }
    }
}
</script>

init({appId:'APP_ID',status:true,cookie:true,xfbml:true});
FB.getLoginStatus(函数(响应){
onStatus(响应);
});
状态函数(响应){
if(response.session){
var timestamp=new Date().getTime();
var expires=响应['session']['expires']*1000;
如果(过期-时间戳>=0){
setTimeout(函数(){window.location.reload();},expires-timestamp);
}
}
}

通过javascript使用客户端流自动登录不是问题。我遇到的情况如下:一个用户来到我们的网站。3600秒后,他/她在该页面中提交表单,但是,会话已过期,我们的脚本无法识别用户是谁。如果我们将用户重定向到自动登录页面,则在自动重新登录后无法获取POST数据。好的,因此另一个选项可能是,尽管它的本质与您在发言中试图实现的相反。通常情况下,你会假设在一个小时的不活动后,用户已经离开,失去了电源,正在看电影,不管怎样。这样一来,他们就可以坐在一台公共pc上,这就是为什么它一开始就过期了。也就是说,为什么不在一个用活动重置的计时器上,让它从3600倒计时到0,当它达到0时,自动将它们重定向到登录,并显示一条消息,说明由于不活动而注销。这样你就不会为了让他们了解你而进行一场艰苦的战斗,但这并没有帮助。当facebook提供的访问令牌(cookie)过期时,它表示未连接。如果访问令牌过期,不是因为用户注销了facebook吗?在这种情况下,您可以让他登录并继续进行API调用。你知道离线访问权限吗?Facebook发行了一个永不过期的访问令牌。可能会对你有所帮助。该用户仍在facebook内,但应用程序的cookie很快就会过期。我考虑过离线访问,但这不是我需要的。因为我在服务器上的帐户会话过期,我不知道客户机是谁。但是,我可以保存对cookie的脱机访问来解决这个问题,但这不是一个好的解决方案
<div id="fb-root"></div>
<script type="text/javascript" src="https://connect.facebook.net/zh_TW/all.js"></script>
<script type="text/javascript">
FB.init({appId: 'APP_ID', status: true, cookie: true, xfbml: true});
FB.getLoginStatus(function(response) {
    onStatus(response);
});

function onStatus(response) {
    if (response.session) {
        var timestamp = new Date().getTime();
        var expires = response['session']['expires'] * 1000;
        if(expires - timestamp >= 0){
            setTimeout(function(){window.location.reload();}, expires - timestamp);
        }
    }
}
</script>