2016-04-22 42 views
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 Ë我已经做到了,我必须:

  1. 添加另一行以“auth_tokens”表
  2. 重新生成cookie来包括新的令牌值?

我一直在尝试持续登录的各种选项,整个星期,这几乎让我在那里,但我磕磕绊绊在最后一块。

回答

2

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

  1. 他们目前的HTTP会话将任何信息给会话绑定在某个需要更新活动用户帐户。
  2. 甲cookie将被放置在包含长期认证令牌的用户的计算机上。

令牌由selector:verifier作为连接字符串组成。

用户来到你的网站下一次,如果他们没有活动会话,cookie将被用来自动记录它们作为相关的用户。这个令牌应该在双方(浏览器和数据库)中被丢弃,并且应该生成一个新的令牌来代替它。

最终的结果是:最终用户,就好像他们永远会登录(直到他们明确地注销,应该无效的标记)。

+1

感谢您的回答,非常感谢。我不明白的是如何在我说到“//然后重新生成登录标记如上”的情况下放弃该标记。我是否会删除该令牌的“auth_tokens”行,然后基本上重新执行if语句内部的“登录后”部分?抱歉提出愚蠢的问题。谢谢 – 4532066

+0

是的。而已。并在用户的Cookie中设置新值。 –