我的网站使用Facebook连接进行登录,我服务器上的会话生命周期为3600。
我正在使用Client-Side Flow(javascript)重定向到login.php,而login.php检索cookie(由javascript设置)以获取访问令牌。
但是,如果用户空闲超过3600秒,则我服务器上的会话将过期。 ($ _SESSION ['uid']不存在。) 我的login.php如何检查用户是否已登录Facebook(不是我的应用程序)?
我正在使用的解决方案是将用户重定向到我的javascript页面,并且facebook会自动触发“onStatus function”。
我正在寻找一个可以用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'];
}
答案 0 :(得分: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>
答案 1 :(得分:0)
我仍然是FB连接和整个过程的新手,但我想把我的2美分。我已经看到一些网站严格建立在有FB的用户上,所以他们登录或不登录FB适用于特定网站我提到。我注意到如果我登录FB并且过去已与这些站点连接,那么如果我没有登录,我会自动登录到所述站点应用相同的逻辑。
这就是说我认为这意味着FB有一个可识别的cookie,可以在某处检测到,如果检测到你可能会在你的脚本中使用它来让用户自动登录超过3600标记。我从twitter和linkedin那里知道他们有用户身份验证令牌,用于识别最终可以存储在数据库中的每个用户并在以后重复使用所以我想也许你会想要再研究一下FB,因为我确定必须这样做也是FB的情况。如果存储与用户关联的此令牌,您可以在其中找到前面提到的cookie,然后检查该身份验证令牌。我很抱歉,如果这没有多大意义我在这里冒烟。如果我对FB的东西更好,我会尝试提供更多帮助,但我处理的基本阶段是了解如何与FB和非fb站点进行交互。
答案 2 :(得分: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
not null并不意味着您拥有该用户的有效访问令牌。测试您是否拥有有效访问令牌的一种方法是尝试进行API调用:
$isvalid;
try {
$facebook->api('/me');
$isvalid = true;
} catch (FacebookApiException $e) {
$isvalid = false;
}