Pusher - аутентифицированные пользователи не получают события из частных каналов
Допустим, у меня есть клиент vue, который пытается получить событие из частного канала, используя pusher сервисы.
Этот клиент аутентифицируется с помощью pusher auth secuence:

Вот документация: https://pusher.com/docs/channels/server_api/authenticating-users/
Похоже, мне нужно предоставить конечную точку на моем сервере, чтобы аутентифицировать пользователя.
Так как в документации говорится , поскольку мой сервер находится в другом домене, чем внешнее приложение, мне нужно использовать CORS или JSONP, я выбираю JSONP.
Мой сервер (бэкенд) сделан на Django с использованием django-rest-framework и предоставляет конечную точку, которая отвечает за обработку socket_id, channel_name и callback, которые генерирует pusher-js (это библиотека фронтенда pusher).
На фронтенд отправляется что-то похожее на код javascript, поэтому ответ должен быть content-type:application/javascript.
Для тестирования события я создал простой скрипт на python, который впоследствии будет интегрирован в логику моей компании. Этот скрипт отвечает за инициирование события.
Проблема: Ну, основная проблема в том, что событие никогда не приходит. Я заглянул в веб-консоль (фронтенд), чтобы проверить правильность работы запросов. Запросы ws protocol отвечают status 101, а конечная точка /auth/pusher - status 200. Так что, похоже, они работают правильно.
- Вот моя конечная точка Django
/auth/pusher:
def get(self, request): pusher_client = pusher.Pusher( app_id = settings.P_APP_ID, key = settings.P_APP_KEY, secret = settings.P_APP_KEY_SECRET, cluster = settings.P_REGION_CLUSTER, ssl = True ) auth = pusher_client.authenticate( channel=request.query_params.get('channel_name'), socket_id=request.query_params.get('socket_id') ) callback_query_params = request.query_params.get('callback') callback = re.sub(r'\\"/g', '', callback_query_params) + "(" + str(auth) + ");"; return Response(callback, content_type = 'application/javascript')
- Вот важная часть подключения пушера в vue:
var pusher = new Pusher(env.pusher_app_key, { cluster: 'us2', authTransport: "jsonp", authEndpoint: "http://localhost:8000/pusher/auth", }); var channel = pusher.subscribe('private-cesar'); channel.bind('my-event', function(data) { console.log(data); this.messages.push(JSON.stringify(data)); });
- Вот скрипт на python, который я сделал для запуска события вручную:
import pusher pusher_client = pusher.Pusher( app_id = settings.P_APP_ID, key = settings.P_APP_KEY, secret = settings.P_APP_KEY_SECRET, cluster = settings.P_REGION_CLUSTER, ssl = True ) while True: option = input("Send? (Y/N)") if option.lower() == "y": pusher_client.trigger('private-cesar', 'my-event', {'message': 'test from python'}) print("Sent") else: break
Итак, в чем проблема, есть ли что-то, что я упускаю?
Я уже выяснил, как использовать его без auth, И он работает, как ожидалось, но в этом случае мне не нужно иметь auth/pusher конечную точку.
РЕШЕНИЕ:
Наконец, я решил эту проблему. Оказывается, мне нужно было вернуть объект HttpResponse, который предоставляется django.core, а не Response, который предоставляет rest_framework.response.
Моя ошибка: полагая, что rest_framework.response является неявным http-ответом.
импорт:
from django.http import HttpResponse
Так что конечная точка заканчивалась следующим образом:
def get(self, request):
pusher_client = pusher.Pusher(
app_id = settings.P_APP_ID,
key = settings.P_APP_KEY,
secret = settings.P_APP_KEY_SECRET,
cluster = settings.P_REGION_CLUSTER,
ssl = True
)
auth = pusher_client.authenticate(
channel=request.query_params.get('channel_name'),
socket_id=request.query_params.get('socket_id')
)
callback_query_params = request.query_params.get('callback')
callback = re.sub(r'/\\"/g', '', callback_query_params) + "(" + str(auth) + ");";
return HttpResponse(callback, content_type = 'application/javascript')