I am trying to implement a PHP persistent login solution to protect some admin pages on a website I'm working on, using this SO answer as the basis:
PHP login system: Remember Me (persistent cookie)
After Logging In
if ($login->success && $login->rememberMe) { // However you implement it
$selector = base64_encode(openssl_random_pseudo_bytes(9));
$authenticator = openssl_random_pseudo_bytes(33);
setcookie(
'remember',
$selector.':'.base64_encode($authenticator),
time() + 864000,
'/',
'yourdomain.com',
true, // TLS-only
true // http-only
);
$database->exec(
"INSERT INTO auth_tokens (selector, token, userid, expires) VALUES (?, ?, ?, ?)",
[
$selector,
hash('sha256', $authenticator),
$login->userId,
date('Y-m-d\TH:i:s', time() + 864000)
]
);
}
Re-Authenticating On Page Load
if (empty($_SESSION['userid']) && !empty($_COOKIE['remember'])) {
list($selector, $authenticator) = explode(':', $_COOKIE['remember']);
$row = $database->selectRow(
"SELECT * FROM auth_tokens WHERE selector = ?",
[
$selector
]
);
if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
$_SESSION['userid'] = $row['userid'];
// Then regenerate login token as above
}
}
My question is that I don't understand what is meant by this section in the "Re-Authenticating On Page Load" section:
// Then regenerate login token as above
Which is the login token it's referring to - does that mean this bit:
$selector = base64_encode(openssl_random_pseudo_bytes(9));
Or this bit:
$authenticator = openssl_random_pseudo_bytes(33);
And once I have done that, do I have to:
- Add another row to the "auth_tokens" table
- Re-generate the cookie to include the new token value?
I've been trying various options for persistent logins all week, and this has almost got me there, but I'm stumbling at this last block.