facebook 从 cookie php 自动重新登录

2023-12-14

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

我在用着客户端流程(javascript)重定向到login.php,login.php检索cookie(由javascript设置)以获取访问令牌。

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

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

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

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'];
    }

我已经想出了一个方法来做到这一点。将以下页面嵌入到所有页面中。

当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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

facebook 从 cookie php 自动重新登录 的相关文章

随机推荐