Не сохраняется сессия 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 и все лежит на одном домене - тогда работает прекрасно


Ответы (0 шт):