持久登录身份验证的说明和实现

时间:2018-07-15 17:27:10

标签: php cookies

我按照这个答案进行php登录系统(记住我) PHP login system: Remember Me (persistent cookie)

我能够使用成功设置cookie

$selector = base64_encode(random_bytes(9));
$authenticator = random_bytes(33);
$token = hash('sha256', $authenticator);
$expires = date('Y-m-d\TH:i:s', time() + 864000);

$stmt2 = $pdo->prepare("INSERT INTO auth_tokens (selector,token,userid,expires) VALUES (:selector, :token, :userid, :expires)");
$stmt2->bindParam(':selector', $selector);
$stmt2->bindParam(':token', $token);
$stmt2->bindParam(':userid', $userid);
$stmt2->bindParam(':expires', $expires);
$stmt2->execute();

setcookie(
        'remember',
         $selector.':'.base64_encode($authenticator),
         time()+86400,
         '/',
         false
);

我似乎不了解这部分。 重新验证页面加载

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
}
}

1。。变量 $ selector $ authenticator

由于代码中有一个查询,内容为从auth_tokens中进行选择,其中选择器= $ selector

2。。每次重新加载页面时,选择器都会更改,从而导致其随机性。因此,如果 $ selector = base64_encode(random_bytes(9)); ,当我运行此查询时,它与选择器列中的任何内容都不匹配 *“ SELECT * FROM auth_tokens WHERE选择器= $选择器” *

有人解释了重新验证页面加载和一些示例代码。

1 个答案:

答案 0 :(得分:1)

  

$selector$authenticator变量中应该包含什么

list($selector, $authenticator) = explode(':', $_COOKIE['remember']);

在先前访问中设置的cookie内容:

setcookie(…, $selector.':'.base64_encode($authenticator), …);
  

每次重新加载页面时,选择器都会更改,从而导致其随机性。

页面重新加载时不应更改。应该在成功登录后立即设置一次,并将其存储在两个位置(服务器数据库和浏览器cookie):

if ($login->success && $login->rememberMe) { // However you implement it
    $selector = base64_encode(random_bytes(9));
    $authenticator = random_bytes(33);
    …
}