#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.