Добавить файлы cookie для Steam OpenID

#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() . Если идентификатор сеанса будет перехвачен, он не будет оставаться действительным долго, если реальный пользователь все еще активен.