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,由于我的服务器与前端应用程序在不同的域中,我需要使用CORS
或JSONP
,我选择JSONP .
我的服务器(后端)是在 Django
中使用 django-rest-framework
创建的,它提供了一个负责处理 socket_id
、channel_name
和 callback
pusher-js
(这是一个推送前端库)生成的。
类似于 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中pusher连接的重要部分:
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/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')
假设我有一个 vue 客户端尝试使用 pusher
服务从私人频道接收事件。
此客户端使用 pusher auth secuence 进行身份验证:
这是文档:https://pusher.com/docs/channels/server_api/authenticating-users/
看来我需要在我的服务器上提供一个端点以验证用户。
所以,作为文档says,由于我的服务器与前端应用程序在不同的域中,我需要使用CORS
或JSONP
,我选择JSONP .
我的服务器(后端)是在 Django
中使用 django-rest-framework
创建的,它提供了一个负责处理 socket_id
、channel_name
和 callback
pusher-js
(这是一个推送前端库)生成的。
类似于 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中pusher连接的重要部分:
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/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')