coderisimo
@coderisimo

Как заставить Yii2 (PHP) работать с PHPSESSID при локальной разработке с Vue и Webpack?

Суть. Все еще хочется получить простую работу Yii в связке с Vue. Т.е не писать rest, не использовать jwt с рефреш-токенами, не настраивать поддомены. И так далее. В данном случае это просто сайт и ничего более.При этом хотелось бы использовать webpack для немедленного обновления странички после изменения в исходниках и прочие плюшки. Речь о локальной разработке. В настоящее время php (yii2) крутится в докере
127.0.0.1:8000 .
Проект vue( quasar.js ) это полностью отдельное приложение - localhost:8080/# После билда все собирается , копируется куда надо в проект Yii , интегрируется в базовую view .Yii не замечает, что его дурят, не используют его фронтэнд с его пенсионерскими формами и табличками на бутстрапе , все работает, как надо.
Однако, devServer webpack хоть и запускает приложение , обновляет оперативно код, УВЫ, не получает сессию в приложении на php. Сессия просто не создается в приложении. Разумеется, я попытался настроить proxy в вебпаке:

proxy: {
        '/': {
          target: 'http://127.0.0.1:8000',
          pathRewrite: {'^/': ''},
          changeOrigin: true,
          secure: false,
        }

без прокси запросы не работают вообще, с ним отрабатывают, даже часть кукисов приходит :

Cookie: XDEBUG_SESSION=PHPSTORM; csrftoken=pGnICOt7JvtQWQCJH3IBTuVti4BY9zwmi9d9Ip8WnY7q5iStlin4gPvxIcFa1kqu; _ga=GA1.1.1833168217.1577004843; gdpr=true; _csrf=721KYaxSy6rOCGu9rLf30vfETmVrHkQU


Но мы же хотим использовать стандартные сессии , чтобы не заморачиваться с jwt , и тут наблюдается полный эпик фейл. Сессии нету. Т.е вот такая кука PHPSESSID=15dd74539c9f9abd33d9451cb626fd23; доступна лишь в мечтах....

Я понимаю , что вопрос специфический, но вдруг ? Любые идеи - вэлкам!
Доброй ночи!
  • Вопрос задан
  • 718 просмотров
Решения вопроса 1
coderisimo
@coderisimo Автор вопроса
Решение : (надеюсь :) . )

В процессе билда помещаем готовые папки css,fonts,js,statics в папку web yii. Там же должен присутствовать Yii-шный файл index.php. Содержимое полученного в результате билда index.html помещаем в одно из пустых представлений Yii. Туда же нужно добавить <?= Html::csrfMetaTags() ?> .
Все вышеописанные операции происходят автоматом в процессе билда и выполняются webpack-ом. Там , вообще можно написать все , что вам угодно. Копирование, добавление кода в файлы И так далее. Представление , которое мы создали открывается при старте нашего приложения.

После вышеописанных манипуляций в теле странички, где размещается SPA будут присутствовать метатеги с srf :
<?= Html::csrfMetaTags() ?>
далее , перед стартом Vue (например в mounted() {.....} ) нужно извлечь csrf из мета тэгов страницы и добавить его в axios.defaults.headers.common

Это будет работать для приложения , которое работает обычным образом. Версия запущенная через webpack ничего не знает о <?= Html::csrfMetaTags() ?> . Соответственно , пишем экшн getToken, который возвращает нам csrf. Это нужно для разработки, чтобы приложение работало с webpack и его плюшками.
public function actionGetToken()
    {
        return yii:: $app->getRequest()->getCsrfToken();
    }


Этот экнш не требует csrf (считается безопасным так , как он GET ). Далее во vue (например в mounted() {.....} ) , в зависимости от ENV при старте приложения берем csrf либо из метатегов , либо вызывав экшн getToken. Это работает, но....
После того как мы проходим процедуру аутентификации сессия обновляется и старый csrf превращается в тыкву. Так же он обновляется всякий раз, когда мы загружаем новую страничку. В данном случае у нас SPA и многократная загрузка новых станиц нам не грозит.Так что единственное , что еще нужно сделать - сразу после аутентификации обновить csrf токен. Я просто возвращаею его, как результат успешного выполнения login.
Снова обновляем axios.defaults.headers.common актуальным csrf , и на этом все. Остальные запросы подписанные данным токеном работают нормально.
Экшн getToken нужен только при локальной разработке и на проде должен быть выключен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Поставьте для ахиоса интерсектор на запросы.
Если нет нужной вам куки обращайтесь на страницу которая содержит только метод старта сессии, например логиниться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы