modx socket.io?
Всем привет. Есть такая интересная штучка, socket.io, для создание очень интересных проектов. Кто-то тут смог ее подружить с modx? Подключить внутри нее апи модх и работать с ним это не проблема. Сложности начинаются когда дело доходит до авторизаций. Сокет сервер не понимает кто перед ним. И если в вебе я авторизовался как admin, то внутри сокета echo $modx->user->get('id'); дает 0. Кто-то сталкивался с подобным? Боролся? Может быть я что-то не так делаю…
Техническая поддержка MODX
Сайт лежит, тормозит или остался без разработчика?
Переезд с MODX 2 на 3, PHP 7 на 8, скорость и безопасность. Поддержка со сроками и ответственностью, а не совет в чате.
Подробнее
Реклама
Комментарии: 32
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
1. По умолчанию может не быть включена передача кукисов в заголовках, или могут быть проблемы кросс-доменных запросов (CORS). Убедитесь, что в сокет-запросах заголовки передаются, а главное, передается кука сессии.
2. На стороне сокет-сервера, где вы подключаете MODX-API, вам надо поймать куку PHPSESSID и скормить в инициализацию $modx. Так же убедитесь, что у вас эта кука там в наличии, а главное, инициализация $modx идет с контекстом, в котором пользователь авторизован.
3. У вас сокет-соединение не понимает авторизацию вообще всегда, или после авторизации если перезагрузить страницу, то все ОК, а просто проблема именно после авторизации без перезагрузки страницы? Просто это важный момент, так как сокет-соединение не отсылает кукисы в каждом запросе. Кукисы отправляются только при установке сокет-соединяния. То есть после авторизации и на логаут надо сокет-соединение реконнектить. Надо смотреть в сторону socketio.close(false, false);
В общем, подробней распишите что и как получилось сделать, а на какой стадии какие затыки. Наверняка разобраться можно будет, но здесь не все так просто и парой строчек кода не отделаться.
Попробуйте для начала без конфига настроить сокет-запросы на тот же домен, просто посмотрите будут ли передаваться кукисы в запросах или нет. Ответа корретного не будет, но хотя бы в запросах кукисы должны появиться. Если появятся, то уже проксирование настраивать. А пока куки не будут передаваться, то и ловить на стороне сервера нечего.
Если в ngnix добавляю дерективу что вы выше скинули (порт только там меняю на 2025, на котором крутится вебсокет) то получаю бесконечные аякс запросы:
P.S. я ушел к Морфею, так что отвечу только через несколько часов, если еще будут комменты.
В моем конфиге полезного больше особо ничего нет, но вот еще кусок, где остальные запросы уходят на основную часть сайта:
К чему я смог прийти:
Если я делаю соединение напрямую, var socket = io(«site.ru:2027»); — соединение устанавливается, без кукисов.
Если я пробую var socket = io("/api"'); — соединение не устанавливается, но кукисы отправляются.
Само проксирование вроде настроено нормально. Если перейти в браузере по site.ru/api/ — Мне сокет сервер говорит {«code»:0,«message»:«Transport unknown»}.
Но из JS он никак не хочет устанавливать соединение… Подозреваю из JS нужно не просто var socket = io('/api/'), а как то по другому. У меня происходит бесконечный коннект на Request URL: site.ru/socket.io/?EIO=3&transport=polling&t=MkEWHBy
Прошу помочь с пунктом 2:
Как это скормить MODX? Апи я подключил
В консоле 0, хотя на сайте я авторизован…
А вот на сокет сервере $_SESSION $_COOKIE пустые…
Ваш пример взял.
Полезно еще дописать $modx->log(1, print_r($_COOKIE, 1), «FILE»); чтобы и куки посмотреть сразу.
$modx->log(1, print_r($_SERVER, 1), «FILE»);
$modx->log(1, print_r($_COOKIE, 1), «FILE»);
proxy_pass localhost:4000;
pastebin.com/rQi0drjw
pastebin.com/pJW87fkd
На JS части я подключаюсь к /api/
const socket = io('http://site.ru/ws/', {
path: '/api'
});
А конфиг nginx с проксей на этот сокет сервер: pastebin.com/rQi0drjw
Вроде бы все должно работать, но что-то не то…
Браузер (JS) -> nginx -> js на порту 4000 -> MODX. И вы ожидаете, что js просто так возьмет и пробросит кукисы до MODX? Просто так он не будет ничего пробрасывать.
P.S. на каждом этапе проброса соединения дебажьте и смотрите, чтобы были кукисы и отправлялись дальше.
Т.е, рендерится страница MODX, где я залогинен. С этой страницы я подключаюсь к /api/, При всех XHR запросах (всех четырех) Cookie: PHPSESSID=7iur19vftnprl05jt4m97kvs13 передается. А до сервера не доходит. Создается WS соединение, на сервере в консоле куки пустые…
print_r($socket->request->headers);
содержит куку.
Array
(
[connection] => upgrade
[host] => site.com
[x-real-ip] => 5.189.120.126
[x-forwarded-for] => 5.189.120.126
[accept] => */*
[user-agent] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
[referer] => site.com/page.html
[accept-encoding] => gzip, deflate
[accept-language] => ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
[cookie] => _ga=GA1.2.63840410.1551895697; _ym_uid=1551895697718358359; _ym_d=1551895697; PHPSESSID=h6k94gg7gbu1b7317maq4loon7
)
Как их передать, и как скормить ее modx? В самом server.php я просто подключаю modx: