When logging in on my site you have the option to "remember me". This will set a "remember me" cookie called "R" with a userid and a token. When the session cookie expires, which is set to 1 day (86400 seconds), the "remember me" cookie should start a new session.
When I test it, I'm setting the session cookie lifetime to 60 seconds. After the expiration date passes the "remember me" cookie starts a new session. But after an hour or so, it won't start a new session anymore and a user has to login again even though the "remember me" cookie still exists.
The token is saved in the database. There is no bug where the hashed cookie is being validated. The user is found.
I've used the following guide on Stackoverflow: Keep me logged in
My code:
// Session class
private $_logged_in = false;
public $user_id;
public $userlevel;
function __construct() {
session_name('connected');
session_set_cookie_params(24*60*60);
ini_set('session.gc_maxlifetime',86400);
session_start();
}
public function is_logged_in() {
if(isset($_COOKIE['R'])) {
$this->check_cookie();
return $this->_logged_in;
} else {
$this->check_login();
return $this->_logged_in;
}
}
private function check_login() {
if(isset($_SESSION['user_id'])) {
$this->user_id = $_SESSION['user_id'];
$this->userlevel = $_SESSION['userlevel'];
$this->_logged_in = true;
} else {
unset($this->user_id);
unset($this->userlevel);
$this->_logged_in = false;
}
}
public function check_cookie() {
$cookie = $_COOKIE['R'];
list($user, $token, $mac) = explode(':', $cookie);
if($mac !== hash_hmac('sha256', $user . ':' . $token, SECRET_KEY)) {
$this->_logged_in = false;
}
if($user = User::find_by_id($user)) {
if($user->rememberme == $token) {
new Session();
$this->user_id = $_SESSION['user_id'] = $user->id;
$this->userlevel = $_SESSION['userlevel'] = $user->userlevel_id;
$this->_logged_in = true;
}
}
}
public function login($user, $rememberme = "") {
if($user && $rememberme == "") {
$this->user_id = $_SESSION['user_id'] = $user->id;
$this->userlevel = $_SESSION['userlevel'] = $user->userlevel_id;
$this->_logged_in = true;
} elseif($user && $rememberme == 'rememberme') {
$this->user_id = $_SESSION['user_id'] = $user->id;
$this->userlevel = $_SESSION['userlevel'] = $user->userlevel_id;
if($user->setRememberMe($this->user_id)) {
$this->_logged_in = true;
}
}
}