modx socket.io?
Всем привет. Есть такая интересная штучка, socket.io, для создание очень интересных проектов. Кто-то тут смог ее подружить с modx? Подключить внутри нее апи модх и работать с ним это не проблема. Сложности начинаются когда дело доходит до авторизаций. Сокет сервер не понимает кто перед ним. И если в вебе я авторизовался как admin, то внутри сокета echo $modx->user->get('id'); дает 0. Кто-то сталкивался с подобным? Боролся? Может быть я что-то не так делаю…
Комментарии: 32
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Fi1osof1. По умолчанию может не быть включена передача кукисов в заголовках, или могут быть проблемы кросс-доменных запросов (CORS). Убедитесь, что в сокет-запросах заголовки передаются, а главное, передается кука сессии.
2. На стороне сокет-сервера, где вы подключаете MODX-API, вам надо поймать куку PHPSESSID и скормить в инициализацию $modx. Так же убедитесь, что у вас эта кука там в наличии, а главное, инициализация $modx идет с контекстом, в котором пользователь авторизован.
3. У вас сокет-соединение не понимает авторизацию вообще всегда, или после авторизации если перезагрузить страницу, то все ОК, а просто проблема именно после авторизации без перезагрузки страницы? Просто это важный момент, так как сокет-соединение не отсылает кукисы в каждом запросе. Кукисы отправляются только при установке сокет-соединяния. То есть после авторизации и на логаут надо сокет-соединение реконнектить. Надо смотреть в сторону socketio.close(false, false);
В общем, подробней распишите что и как получилось сделать, а на какой стадии какие затыки. Наверняка разобраться можно будет, но здесь не все так просто и парой строчек кода не отделаться.
Fi1osofПопробуйте для начала без конфига настроить сокет-запросы на тот же домен, просто посмотрите будут ли передаваться кукисы в запросах или нет. Ответа корретного не будет, но хотя бы в запросах кукисы должны появиться. Если появятся, то уже проксирование настраивать. А пока куки не будут передаваться, то и ловить на стороне сервера нечего.
Если в ngnix добавляю дерективу что вы выше скинули (порт только там меняю на 2025, на котором крутится вебсокет) то получаю бесконечные аякс запросы:
Fi1osofP.S. я ушел к Морфею, так что отвечу только через несколько часов, если еще будут комменты.
Fi1osofВ моем конфиге полезного больше особо ничего нет, но вот еще кусок, где остальные запросы уходят на основную часть сайта:
К чему я смог прийти:
Если я делаю соединение напрямую, 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 пустые…
Fi1osofВаш пример взял.
Fi1osofПолезно еще дописать $modx->log(1, print_r($_COOKIE, 1), «FILE»); чтобы и куки посмотреть сразу.
$modx->log(1, print_r($_SERVER, 1), «FILE»);
$modx->log(1, print_r($_COOKIE, 1), «FILE»);
Fi1osofFi1osofproxy_pass localhost:4000;
Fi1osofFi1osofpastebin.com/rQi0drjw
Fi1osofFi1osofpastebin.com/pJW87fkd
На JS части я подключаюсь к /api/
const socket = io('http://site.ru/ws/', {
path: '/api'
});
А конфиг nginx с проксей на этот сокет сервер: pastebin.com/rQi0drjw
Вроде бы все должно работать, но что-то не то…
Fi1osofБраузер (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
)
Fi1osofFi1osofКак их передать, и как скормить ее modx? В самом server.php я просто подключаю modx: