3
我想实现一个PHP持久登录解决方案来保护网站我工作的一些管理页面,使用这种SO回答为基础:PHP持久登录 - 重生登入凭证
PHP login system: Remember Me (persistent cookie)
记录在
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)
]
);
}
重新认证页面加载后
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
}
}
我的问题是,我不明白什么是“重新进行身份验证在页面加载”一节中本节的意思是:
// Then regenerate login token as above
这是登录令牌它引用 - 这是否意味着该位:
$selector = base64_encode(openssl_random_pseudo_bytes(9));
或者此位:
$authenticator = openssl_random_pseudo_bytes(33);
与ONC Ë我已经做到了,我必须:
- 添加另一行以“auth_tokens”表
- 重新生成cookie来包括新的令牌值?
我一直在尝试持续登录的各种选项,整个星期,这几乎让我在那里,但我磕磕绊绊在最后一块。
感谢您的回答,非常感谢。我不明白的是如何在我说到“//然后重新生成登录标记如上”的情况下放弃该标记。我是否会删除该令牌的“auth_tokens”行,然后基本上重新执行if语句内部的“登录后”部分?抱歉提出愚蠢的问题。谢谢 – 4532066
是的。而已。并在用户的Cookie中设置新值。 –