2016-04-22 41 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中設置新值。 –