#php #cookies
#php #файлы cookie
Вопрос:
Я использую этот репозиторий GitHub, чтобы пользователи могли входить в систему через Steam.
В этом репозитории используются сеансы, которые длятся недолго или до закрытия браузера, поэтому мне нужно использовать файлы cookie, чтобы пользователи могли входить в систему в течение длительного периода.
После некоторого исследования, из документации по файлам cookie и задаваемых вопросов, пользователи имеют имя пользователя и пароль и не используют третью сторону для входа в систему.
Я впервые использую сеансы и файлы cookie, поэтому, пожалуйста, потерпите.
Вот как выглядит код для входа в систему:
<?php
ob_start();
session_start();
function logoutbutton() {
echo "<form action='' method='get'><button name='logout' type='submit'>Logout</button></form>";
}
function loginbutton($buttonstyle = "square") {
$button['rectangle'] = "01";
$button['square'] = "02";
$button = "<a href='?login'><img src='https://steamcommunity-a.akamaihd.net/public/images/signinthroughsteam/sits_".$button[$buttonstyle].".png'></a>";
echo $button;
}
if (isset($_GET['login'])){
require 'openid.php';
try {
require 'SteamConfig.php';
$openid = new LightOpenID($steamauth['domainname']);
if(!$openid->mode) {
$openid->identity = 'https://steamcommunity.com/openid';
header('Location: ' . $openid->authUrl());
} elseif ($openid->mode == 'cancel') {
echo 'User has canceled authentication!';
} else {
if($openid->validate()) {
$id = $openid->identity;
$ptn = "/^https?://steamcommunity.com/openid/id/(7[0-9]{15,25} )$/";
preg_match($ptn, $id, $matches);
$_SESSION['steamid'] = $matches[1];
if (!headers_sent()) {
header('Location: '.$steamauth['loginpage']);
exit;
} else {
?>
<script type="text/javascript">
window.location.href="<?=$steamauth['loginpage']?>";
</script>
<noscript>
<meta http-equiv="refresh" content="0;url=<?=$steamauth['loginpage']?>" />
</noscript>
<?php
exit;
}
} else {
echo "User is not logged in.n";
}
}
} catch(ErrorException $e) {
echo $e->getMessage();
}
}
if (isset($_GET['logout'])){
require 'SteamConfig.php';
session_unset();
session_destroy();
header('Location: '.$steamauth['logoutpage']);
exit;
}
if (isset($_GET['update']) || !empty($_SESSION['steam_uptodate']) amp;amp; $_SESSION['steam_uptodate'] (24*60*60) < time()){
unset($_SESSION['steam_uptodate']);
require 'userInfo.php';
header('Location: '.$_SERVER['PHP_SELF']);
exit;
}
?>
Я пытался заменить $_SESSION['steamid'] = $matches[1];
на setcookie("CookieTest", $matches[1], time() 3600);
и заменил любой $_SESSION
на $_COOKIE
, и когда я пытаюсь войти в систему, файл cookie устанавливается в браузере, но он не регистрирует меня
Мой вопрос в том, как я могу реализовать файлы cookie с помощью этой аутентификации Steam, чтобы я мог сохранять пользователей зарегистрированными для будущих посещений?
Комментарии:
1. Вы вызывали
session_start()
до отправки каких-либо выходных данных? Это должно быть среди ваших первых строк. Такжеerror_reporting(E_ALL); ini_set('display_errors', 1);
вверху (отключить на вашем реальном сервере). Для этого лучше использовать сеанс, а не обычный файл cookie. Не сохраняйте идентификатор steam пользователя в файле cookie, а затем используйте его для перезагрузки сеанса, поскольку это может позволить любому пользователю выдавать себя за любого другого пользователя на вашем сайте.2. @MichaelBerkowski Да, я вызвал session_start() . Я отредактировал свой пост с полным кодом. Я сохранял идентификатор пользователя steam просто как тест, чтобы проверить, работает ли он.
3. По какой причине вы используете буферизацию
ob_start()
вывода? Если у вас также включен display_errors, главное, что вам нужно искать, чтобы убедиться, что сеансы вообще работают, это убедиться, что session_start() не вызывает никаких ошибок «заголовки уже отправлены». Если он работает, PHP установит файл cookie типа «phpsessid», и вы сможете проверить,$_SESSION['steamid']
установлен ли он при загрузке этого скрипта.4. @MichaelBerkowski Как я упоминал в своем посте, это репозиторий github, я не писал этот код. И нет никаких проблем с сеансами, они работают так, как задумано, и «phpsessid» установлен, все хорошо. Я хочу внедрить файлы cookie, чтобы пользователи могли входить в систему после закрытия браузера
5. Понял — я не просматривал github и ошибочно предположил, что вы создали этот код вокруг внешней библиотеки. Тайм-аут сеансового файла cookie по умолчанию равен 0 (закрытие браузера), но вы можете вызвать
session_set_cookie_params()
, чтобы установить более длительный тайм-аут, например, несколько дней. Чтобы выполнить отдельную реализацию файлов cookie «запомнить меня», вам также потребуется база данных для постоянного хранения некоторого значения токена, которое вы генерируете и связываете с пользователем. Самый простой путь — просто продлить время сеанса cookie
Ответ №1:
Для создания действительно полноценной функции «запомнить меня» вам обычно требуется база данных для хранения сгенерированного пользовательского токена с датой истечения срока действия и любыми другими условиями, которые вы можете решить, что вам нужно. Затем токен будет сохранен в файле cookie с setcookie()
помощью .
Но самый простой способ — продлить срок службы обычного файла cookie сеанса PHP на период времени, превышающий его значение по умолчанию 0
(до закрытия браузера). Вы можете сделать это с session_set_cookie_params()
помощью, выбрав длительный срок службы.
// Session cookie lasts 2 days
session_set_cookie_params(172800);
При использовании сеансового или другого файла cookie для идентификации пользователя важно постоянно использовать HTTPS и установить параметр файла cookie secure
// Specify path, domain, and secure
session_set_cookie_params(172800, '/', '.example.com', true);
Еще одно небольшое смягчение, которое вы можете предпринять против фиксации сеанса, — это генерировать новый идентификатор сеанса при каждой загрузке страницы простым вызовом session_regenerate_id()
. Если идентификатор сеанса будет перехвачен, он не будет оставаться действительным долго, если реальный пользователь все еще активен.