Pusher - аутентифицированные пользователи не получают события из частных каналов

Допустим, у меня есть клиент vue, который пытается получить событие из частного канала, используя pusher сервисы.

Этот клиент аутентифицируется с помощью pusher auth secuence: enter image description here

Вот документация: 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')
Вернуться на верх