Не сохраняется сессия php при fetch запросе
Пишу сайт на реакте, фронт расположен на example.com, бэк на api.example.com. Бэк на php. Запросы отправляю через fetch api. Проблема следующая: php создает новую сессию при каждом запросе. Id сессии хранится в куках браузера, он не меняется, но видимо не отправляется на сервер, массив $_COOKIE пустой. Написал небольшой пример, где я пытаюсь отправить на сервер логин и пароль, тот должен сохранить логин в сессию и вернуть его при следующем запросе, но вместо этого создает новую сессию, где логина разумеется нет. Вот код:
ExampleApp.js
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Greetings from "./Greetings";
import Signin from "./Signin";
function ExampleApp() {
return (
<BrowserRouter>
<Routes>
<Route path="/" Component={Greetings} />
<Route path="/login" Component={Signin} />
</Routes>
</BrowserRouter>
);
}
export default ExampleApp;
Signin.js
function Signin () {
const handle = async (event) => {
event.preventDefault();
const formData = new FormData(event.target);
fetch(event.target.action, {
method: 'POST',
body: formData
})
.then((response)=>console.log(response.json()));
}
return (
<form onSubmit={handle} action="https://api.example.com/api/test/login.php">
<input type="text" name="login" placeholder="login"></input>
<input type="password" name="password" placeholder="password"></input>
<button type="submit">submit</button>
</form>
);
}
export default Signin;
Greetings.js
function Greetings () {
function get_login() {
fetch("https://api.example.com/api/test/get.php?login", { credentials: 'include' })
.then((response) => { return response.json()["login"] });
}
const login = get_login();
return (<div>Welcome, {login}!</div>);
}
export default Greetings;
get.php
<?php
session_start();
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
$response = $_REQUEST;
foreach ($response as $name => $value) {
if (isset($_SESSION[$name])) {
$response[$name] = $_SESSION[$name];
} else {
$response[$name] = $name . " is unset in session. Session id: " . session_id();
}
}
echo json_encode($_COOKIE); // []
echo json_encode($response); // {"login":"login is unset in session. Session id: n9r5doecdpf3ij66bt2r396pms"} (отличается от куков браузера)
?>
login.php
<?php
session_start();
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
// тут мы как будто проверяем логин и пароль
// если все хорошо, сохраняем в сессию
$_SESSION["login"] = $_REQUEST["login"];
echo json_encode($_COOKIE); // []
echo json_encode(["success"=>true, "session_id" => session_id()]); // снова отличается от куков браузера
?>
Если я не пишу фронт, все делаю через php и все лежит на одном домене - тогда работает прекрасно