我的网站使用 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'];
}