Pusher - 经过身份验证的用户未从私人渠道接收事件

Pusher - autenticated users not receiving events from private channels

假设我有一个 vue 客户端尝试使用 pusher 服务从私人频道接收事件。

此客户端使用 pusher auth secuence 进行身份验证:

这是文档:https://pusher.com/docs/channels/server_api/authenticating-users/

看来我需要在我的服务器上提供一个端点以验证用户。

所以,作为文档says,由于我的服务器与前端应用程序在不同的域中,我需要使用CORSJSONP,我选择JSONP .

我的服务器(后端)是在 Django 中使用 django-rest-framework 创建的,它提供了一个负责处理 socket_idchannel_namecallback pusher-js(这是一个推送前端库)生成的。

类似于 javascript 代码的东西被发送到前端,因此响应需要是 content-type:application/javascript

为了测试事件,我制作了一个简单的 python 脚本,稍后我会将其集成到我的业务逻辑中。此脚本负责触发事件。

问题:主要问题是事件永远不会到达。我查看了网络控制台(前端)以检查请求的正确功能。 ws protocol 请求以 status 101 响应,端点 /auth/pusherstatus 200 响应。所以他们似乎工作正常。

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')
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));
});
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/pusher 端点。

解决方案:

最后,我解决了这个问题。结果我需要 return 一个 HttpResponse 对象,它由 django.http 提供,而不是 rest_framework.response 提供的 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')