У меня есть два PHP-файла.
Первый: http://huntinggrounds.de/test/sessionToken.php
открыть новый сеанс с помощью session_start () и иметь переменную $ _SESSION [‘token’] = «123»;
Делая выборку (ajax-call) для моего второго файла (formTest.php), я хотел бы вернуть этот $ _SESSION [‘token’].
Но это всегда недействительно.
Я обнаружил, что я всегда получаю новый SessionID. Что однозначно неправильно.
Если я позвоню http://huntinggrounds.de/test/formTest.php направьте через браузер. Все правильно. Так что проблема должна быть в вызове ajax.
Вот источники:
В стартовом файле sessionToken.php:
fetch(form.getAttribute("action"), {
method: 'POST',
headers: {
'x-csrf-token': token,
'Accept': 'application/json, text/plain, */*',
'credentials': 'include'
},
body: data
})
мой PHP-файл formTest.php
<?php
//session_id('joe');
//session_start();
if (session_status()==1) {
session_start(); $sessionStart = "sessionNEU";
}
header('Access-Control-Allow-Methods: POST');
header("X-Powered-By: joe");
header("Access-Control-Allow-Headers: x-csrf-token, X-Requested-With");
header("Access-Control-Expose-Headers: x-csrf-token");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Origin: *');
header($_SERVER["SERVER_PROTOCOL"]." 200 Ok");
header('Content-type: application/json');
$response= array();
$tokenNeu = generateToken(16);
//$tokenAlt = $_SERVER['HTTP_X_CSRF_TOKEN'];
$response["session"]["ID"] = session_id();
$response["session"]["savePath"] = session_save_path();
$response["session"]["startsNew"] = $sessionStart ? "yes" : "no";
$response["session"]["hasToken"] = isset($_SESSION['token']) ? "yes" : "no";
$response["session"]["token"] = $_SESSION['token'];
$response["session"]["tokenValid"] = ($_SESSION['token'] == $_SERVER['HTTP_X_CSRF_TOKEN']) ? "valid" : "invalid";
$response["session"]["tokenCSFR"] = $_SERVER['HTTP_X_CSRF_TOKEN'];
$response["session"]["tokenNew"] = $tokenNeu;
echo json_encode($response);...
Любая идея, что заставляет testForm.php дать новый SessionID.
(Когда я устанавливаю в обоих файлах session_id (‘joe’); это работает как шарм)
Пожалуйста, не комментируйте, что session_start (); должен быть в первой строке. Это проверено и не удается.
Я нахожусь на PHP7.
Вы должны поместить учетные данные в опции, а не в заголовки, смотрите: http://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
fetch(form.getAttribute("action"), {
method: 'POST',
headers: {
'x-csrf-token': token,
'Accept': 'application/json, text/plain, */*'
},
'credentials': 'include',
body: data
})
Других решений пока нет …