Неспособность поддерживать сессию php в среде CORS - PullRequest
0 голосов
/ 03 мая 2019

У меня есть такая ситуация: у меня есть проект php, который я создал с нуля, выступая в качестве конечной точки API для клиентского веб-приложения, созданного с помощью React.На данный момент они оба работают локально, php работает на localhost:8000 и реагирует на localhost:3000.Эта проблема появляется, когда я пытаюсь сделать запрос защищенным токеном с помощью axios.Сгенерированный php сеанс теряется после входа в систему.

Я пытался добавить withCredentials:true на стороне клиента, а также включить header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); на стороне сервера, как упоминалось здесь во многих ответах, но безуспешно,

Заголовки PHP:

header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');

Запрос Axios:

return axios({
    method: 'GET',
    url: LOAD_NOTES_ENDPOINT,
    headers: {'Authorization': token, 'Access-Control-Allow-Origin': '*',}
})
.then(response => {
    console.log(response.data);
    return response;
})
.catch(
    (err) => {
        return err.response;
    }
);

В настоящее время я могу отправить токен генерации при входе в систему и отправить его обратно при попытке доступа к защищенномумаршрут, и это работает нормально, если я сделаю запрос на Почтальон, и это подтвердило, что это строго проблема CORS.Я изо всех сил пытался найти решение в течение 2 дней и открыл все возможные ссылки в Интернете по этой проблеме, но все они предлагают то, что я уже пробовал и не сработало.Я мог бы найти обходной путь, но это сделало бы сервер открытым для атак CSRF, и это то, что я должен предотвратить.

Я что-то здесь упускаю?Кто-нибудь еще нашел решение по этому поводу?

1 Ответ

0 голосов
/ 04 мая 2019

Ну, я не знаю, что там происходит. Однако я запустил эту маленькую настройку:

файл 55976696.php

header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');

echo json_encode('php successs');

php -S localhost: 8000 55976696.php

файл 55976696.js

var express = require('express');
const app = express()

app.get('/', (req, res) => res.sendFile('55976696.html', {root: __dirname}))

app.listen(3000, () => console.log(`Example app listening on port 3000!`))

file 55976696.html

<html>
<head>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
function test() {
    axios.get('http://localhost:8000', {
        withCredentials: false,
    }).then(res => { 
        console.log('SUCCESS', res);
    }).catch(error => {
        console.log('erro', error);
    })
   }; 
</script>
</head>
<body>
test
<div onClick="test()">go</div>
</body>
</html>

узел 55976696.js

В вызове axios.get произошли небольшие изменения, и я убедился, что заголовок PHP - это то, что я хочу ...

...