gpt4 book ai didi

PHP 持久登录 - 重新生成登录 token

转载 作者:可可西里 更新时间:2023-10-31 23:28:42 27 4
gpt4 key购买 nike

我正在尝试实现一个 PHP 持久登录解决方案来保护我正在处理的网站上的一些管理页面,使用这个 SO 答案作为基础:

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

它指的是哪个登录 token - 这是否意味着这个位:

$selector = base64_encode(openssl_random_pseudo_bytes(9));

或者这个位:

$authenticator = openssl_random_pseudo_bytes(33);

完成后,我是否必须:

  1. 向“auth_tokens”表添加另一行
  2. 重新生成 cookie 以包含新的 token 值?

整个星期我都在尝试各种持久登录选项,这几乎让我到达那里,但我在最后一个 block 上绊倒了。

最佳答案

当您第一次登录时,如果您选中“记住我”框,会发生两件事:

  1. 他们当前的 HTTP session 将使用将 session 绑定(bind)到事件用户帐户所需的任何信息进行更新。
  2. 将在用户的计算机上放置一个包含长期身份验证 token 的 cookie。

token 由 selector:verifier 作为串联字符串组成。

下次您的用户访问您的网站时,如果他们没有事件 session ,cookie 将用于自动以关联用户的身份登录。然后应该在双方(浏览器和数据库)上丢弃这个 token ,并且应该生成一个新的 token 来取而代之。

最终结果是:对于最终用户而言,就像他们永远登录一样(直到他们明确注销,这会使 token 失效)。

关于PHP 持久登录 - 重新生成登录 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36796205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com