facebook从cookie php自动重新登录

问题描述

| 我的网站使用Facebook connect进行登录,服务器上的会话寿命为3600。 我正在使用客户端流(javascript)重定向到login.php,login.php检索cookie(由javascript设置)以获取访问令牌。 但是,如果用户闲置了3600秒以上,则服务器上的会话将过期。 ($ _SESSION [\'uid \']不存在。) 我的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(用于登录):
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>
    ,我仍然是FB连接和整个过程的新手,但我想投入2美分。我看到一些站点严格建立在拥有FB用户的基础上,因此他们登录或不登录FB都适用于我提到的特定站点。我已经注意到,如果我已登录FB并过去与这些站点建立了连接,那么我将自动重新登录到该站点,如果我未登录,则将应用相同的逻辑。 也就是说,我认为这意味着FB具有可识别的cookie,可以在某处检测到它,如果检测到,则可以在脚本中使用它来使用户自动登录到3600标记之后。我从twitter和linkedin知道,它们具有用户身份验证令牌,这些令牌标识最终可以存储在数据库中并在以后重用的每个用户。因此,我想您可能想对FB进行更多研究,因为我肯定必须FB也是如此。在您存储与用户关联的令牌的地方,您可以在其中找到是否找到了前面提到的cookie,然后检查该身份验证令牌。对不起,如果这没有太大意义,我会在这里冒烟。如果我在FB方面做得更好,我会尝试提供更多帮助,但是我处于了解如何与FB和非fb站点进行交互的最基本阶段。     ,在保持客户端流程的同时,您可以使用Facebook PHP SDK(请参阅github)来处理用户会话。
$facebook = new Facebook(...);

// Get the User ID
$user = $facebook->getUser(); 
“ 4”不为null表示用户已登录Facebook并已通过身份验证。您不再需要这里提供的PHP(
get_facebook_cookie
),它都包含在Facebook PHP SDK中。对您来说应该足够了。 更进一步:如果您要对该用户进行API调用。 “ 4”不为null并不表示您具有该用户的有效访问令牌。测试您是否具有有效访问令牌的一种方法是尝试进行API调用:
$isvalid;

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...