如何解决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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。