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中設置新值。 –