在JS + PHP(宅基地)环境中,在Pusher中订阅公共频道效果很好(也验证了我的凭据)。给出以下代码,订阅私人频道失败:
let theAppId = 'XXXYYYZZZ'; //fake credentials shown here...
pusher = new Pusher(theAppId, {
authEndpoint: '/pusher/auth',
cluster: 'us2',
forceTLS: true,
encrypted: true,
auth: {headers: {'X-CSRF-Token': self.csrf}}
});
channel = pusher.subscribe('private-channel1');
我的身份验证代码被调用并返回有效的身份验证信号:
{\"auth\":\"c289b20c368bd23a4a85:d55f1f1495f0d252b5fde1d69e2e6d5b4b161ca49cab5ad218d65111ae307a12\"}"}
成功连接后,Pusher.log显示此错误:
Pusher : Event recd : {"event":"pusher:error","data":{"code":null,"message":"Invalid key in subscription auth data: '{\"auth\"'"}}
pusher.min.js:8 Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":null,"message":"Invalid key in subscription auth data: '{\"auth\"'"}}}
我在Pusher文档中找不到关于此问题的任何提及。任何人都看到了这一点,或者对解决方法有任何想法?
答案 0 :(得分:0)
此错误的最可能原因是auth
哈希在从服务器返回之前已被“字符串化”。这就是为什么错误消息提到找到无效键的原因:该值不能被解析为JSON对象。
要解决此问题,服务器需要返回纯JSON。
答案 1 :(得分:0)
感谢Hosam的提示。对于您的Laravel用户而言,该问题很容易解决。请注意,您的身份验证路由的响应为json。从pusher->socket_auth
创建有效的auth密钥返回的值是json编码的字符串。要解决此问题,只需对关联数组进行json_decode
socket_auth
响应,然后将其传递到控制器json响应中:
$thePusher = new \Pusher\Pusher(
env('PUSHER_APP_KEY'),env('PUSHER_APP_SECRET'),env('PUSHER_APP_ID'),
['cluster'=>env('PUSHER_CLUSTER'),'useTLS'=>true]
);
$theResult=$thePusher->socket_auth(
$aRequest>input('channel_name'),
$aRequest->input('socket_id'));
return response()->json(json_decode($theResult,true),200);