2011-05-25 137 views
3

我的网站使用Facebook的连接用于登录,我的服务器上的会话有效期是3600Facebook的自动重新登录

我使用Client-Side Flow(JavaScript)的重定向到login.php中,和的login.php检索cookie(由javascript设置)以获取访问令牌。

但是,如果用户闲置超过3600秒,则服务器上的会话过期。 ($ _SESSION ['uid']不存在。) 我的login.php如何检查用户是否已经登录Facebook(不是我的应用)?

我正在使用的解决方案是将用户重定向到我的JavaScript页面,并且“onStatus函数”将被facebook自动触发。

我正在寻找一个解决方案,可以使用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:

function get_facebook_cookie($app_id, $app_secret) { 
    $args = array(); 
    if(!isset($_COOKIE['fbs_' . $app_id])) 
     return false; 
    parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args); 
    ksort($args); 
    $payload = ''; 
    foreach ($args as $key => $value) { 
    if ($key != 'sig') { 
     $payload .= $key . '=' . $value; 
    } 
    } 
    if (md5($payload . $app_secret) != $args['sig']) { 
     return false; 
    } 
    return $args; 
} 

$cookie = get_facebook_cookie(MY_APP_ID, MY_APP_SECRET); 

if($cookie){ 
    if($result = @file_get_contents("https://graph.facebook.com/me/?access_token=".$cookie['access_token'])){ 
     $result = json_decode($result, true); 
     $_SESSION['uid'] = $result['id']; 
    } 

回答

2

我已经想出了一种方法来做到这一点。在所有页面中对下一页进行iframe。

当facebook通过cookie给出的访问令牌到期时,iframe中的页面自动刷新。 而FB.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> 
+0

并将参数传递到iframe中,您可以在这里看看http://stackoverflow.com/questions/1663396/passing-url-parameters-to-iframe-using-jquery-or-javascript – Uri 2011-09-19 07:36:38

0

进出口仍然对于新手到FB连接和全过程,但我希望把我的2美分,我都看到了。一些网站严格建立在拥有FB的用户上,因此他们登录或不登陆FB适用于我提到的特定网站。我注意到,如果我在FB上登录并在过去与这些站点连接,那么我将自动登录到所述站点,如果我没有登录,则应用相同的逻辑。

这就是说,我认为这意味着FB有一个可识别的cookie可以在某个地方检测到,如果检测到可以在脚本中使用它,以使用户自动登录超过3600分。我从twitter和linkedin了解到,他们拥有用户身份验证令牌,可以识别每个最终可以存储在数据库中的用户,并在以后重复使用。因此,我想也许您希望通过FB来了解更多信息,因为我确信必须FB也是如此。在存储与用户关联的令牌时,如果您发现前面提到的cookie已找到,那么请检查该验证令牌。对不起,如果这没有什么意义我在这里运行烟雾。如果我对FB的东西更好,我会尽力提供更多帮助,但我处于理解如何与FB和非fb站点交互的基本阶段。

+0

这不是使用客户端的流量通过JavaScript来自动登录的问题。我遇到的情况如下:用户来到我们的网站。 3600秒后,他/她在该页面提交表单,但会话已过期,我们的脚本无法识别用户是谁。如果我们将用户重定向到自动登录页面,那么在自动重新登录后我们无法获得POST数据。 – benck 2011-05-25 09:49:48

+0

好的,所以另一种选择可能是,尽管它的本质与你试图在说话方面达到的目的相反。通常情况下,您会在一小时不活动后假设用户已经走开,失去动力,正在观看电影,无论如何。有了它,他们可以在公共电脑,这就是为什么它过期的开始。这就是说,为什么不在一个具有活动性的重置计时器中,它从3600开始倒数​​到0,当它达到0时,就会自动将它们重定向到登录,并显示一条消息,指出由于不活动而退出登录。这样,你不打一场艰苦的战斗,让他们在 – chris 2011-05-25 11:39:34

0

在保持客户端流程的同时,您可以使用Facebook PHP SDK(see on github)来处理用户会话。

$facebook = new Facebook(...); 

// Get the User ID 
$user = $facebook->getUser(); 

$user not null表示用户登录Facebook并进行身份验证。你不再需要你在这里给出的PHP(get_facebook_cookie和东西):它都包含在Facebook PHP SDK中。对你来说应该够了。


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

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

$isvalid; 

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

谢谢,但它并没有帮助。当facebook的访问令牌(cookie)过期时,它表示没有连接。 – benck 2011-05-27 11:53:50

+0

如果访问令牌过期,是不是因为用户注销了Facebook?在这种情况下,您可以让他登录并继续进行API调用。你知道offline_access许可吗? Facebook发出永不过期的访问令牌。可以帮助你。 – Quentin 2011-05-27 12:01:59

+2

用户仍在Facebook内,但Cookie即将过期。我考虑过offline_access,但这不是我需要的。由于我的服务器上的帐户会话过期,我不知道客户是谁。不过,我可以保存离线访问cookie来解决问题,但不是一个好的解决方案。 – benck 2011-05-27 13:25:15