Я пытаюсь реализовать постоянное решение для входа в систему для защиты некоторых страниц администратора на веб-сайте, над которым я работаю, используя этот ответ SO в качестве основы:
Система входа в систему PHP: Запомнить меня (постоянный файл 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('Ymd\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);
И как только я это сделал, мне нужно:
Я пробовал различные варианты постоянных логинов всю неделю, и это почти привело меня туда, но я спотыкаюсь на этот последний блок.
Когда вы входите в систему в первый раз, если вы установите флажок «запомнить меня», произойдут две вещи:
Маркер состоит из selector:verifier
в виде конкатенированной строки.
В следующий раз, когда ваш пользователь придет на ваш сайт, если у них нет активного сеанса, cookie будет использоваться для автоматического входа в систему в качестве связанного пользователя. Затем этот токен должен быть отброшен с обеих сторон (браузер и база данных), а новый должен быть сгенерирован, чтобы занять его место.
Конечный результат: для конечных пользователей это похоже на то, что они вошли в систему навсегда (пока они явно не выходят из системы, что должно привести к недействительности токенов).