具有“记住我”功能的PHP登录系统[重复]
为了增强用户体验,您可以实现“记住我” PHP 登录系统中的功能,允许用户在多个会话中保持登录状态。
安全Cookie 存储
存储持久 Cookie 的最佳实践是使用数据库中名为 auth_tokens 的单独表:
CREATE TABLE `auth_tokens` ( `id` integer(11) not null UNSIGNED AUTO_INCREMENT, `selector` char(12), `token` char(64), `userid` integer(11) not null UNSIGNED, `expires` datetime, PRIMARY KEY (`id`) );
登录后
登录后,为选择器和生成唯一的随机值token:
if ($login->success && $login->rememberMe) { $selector = base64_encode(random_bytes(9)); $authenticator = random_bytes(33); setcookie( 'remember', $selector . ':' . base64_encode($authenticator), time() + 864000, // 10 days '/', 'yourdomain.com', true, // TLS-only true // http-only ); // Insert data into the database $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']); // Retrieve row from the database $row = $database->selectRow( "SELECT * FROM auth_tokens WHERE selector = ?", [ $selector ] ); // Verify hash and set session if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) { $_SESSION['userid'] = $row['userid']; // Regenerate a login token as per previous example } }
详细信息
以上是如何在 PHP 登录系统中实现'记住我”功能以增强用户体验?的详细内容。更多信息请关注PHP中文网其他相关文章!