как использовать сеансы php и svelte вместе

#php #svelte

#php #стройный

Вопрос:

Я использую php для своего серверной части приложения. Я создал систему аутентификации с двумя loginUser.php и loginCheck.php

В loginUser.php если имя пользователя и пароль указаны правильно:

 session_start();
session_regenerate_id();
$_SESSION['bookstore_username'] = $_POST['username'];
session_write_close();

$response = array('status' => true, 'message' => 'user successfully authorized.', 'data' => $row);
echo json_encode($response);
 

Затем в loginCheck.php

 session_start();

 
if (isset($_SESSION["bookstore_username"]) amp;amp; $_SESSION["bookstore_username"] == $_POST['username']) {
       $response = array('status' => true, 'message' => "user is logged in.");
       echo json_encode($response);
   } else {
       $response = array('status' => false, 'message' => "user is not logged in.");
       echo json_encode($response);
   }
 

Когда я тестировал его в приложении Postman, все было в порядке, и ответ показал, что пользователь вошел в систему, но в приложении svelte после входа пользователя в систему, когда я проверяю статистику входа, ответ всегда false, а сеанс равен null.

 const checkUserIsLoggedIn = async (): Promise<void> => {
        const url = ORIGIN   "Backend/api/user/loginCheck.php";

        let data = new FormData();
        data.append("username", userInformationStore?.get().username);

        const res = await fetch(url, {
            method: "POST",
            body: data,
        });

        let response = await res.json();

        console.log(response);
    };
 

Комментарии:

1. Там есть несколько пугающих запутанных вещей. Очень наивно брать пользовательский ввод из $_POST и устанавливать переменные сеанса на основе этого. Вещи, которые вы используете в сеансе для определения состояния пользователя и входа в систему, не должны устанавливаться непосредственно из данных, размещенных пользователем. Во всяком случае, одна вещь, которую я сразу замечаю, это то, что вы не устанавливаете header('Content-Type: application/json; charset=utf-8'); для своих скриптов, которые возвращают json с использованием echo.

2. @gview Я поделился только частью своего кода. Я заметил это.

Ответ №1:

Предполагая, что сеанс зависит от файла cookie, единственное объяснение, которое я вижу для того, чтобы сеанс был нулевым, заключается в том, что файл cookie сеанса не передается обратно на ваш сервер. По умолчанию fetch разрешены только файлы cookie того же происхождения. Попробуйте добавить следующую опцию в свою fetch операцию, чтобы разрешить передачу файлов cookie в запросах из разных источников:

         const res = await fetch(url, {
            method: "POST",
            body: data,
            credentials: "include",
        });

 

Подробности см. В этом параграфе документации Fetch API.