我正在尝试使用Laravel 5.4(后端)和Angular 2(前端)将聊天集成到webapp中。我有一个unqiue广播频道向用户发送消息。每个用户都有自己的频道chat-{uuid}
,其中uuid
是聊天表中的唯一ID,该聊天表还存储可以访问该频道的用户的userID
。问题是永远不会调用授权回调,因此任何用户如果知道uuid
就可以访问该频道。我不确定我做错了什么
channels.php
// This authorization is never called
Broadcast::channel('chat-{uuid}', function ($user, $uuid) {
return false;
});
NewMessage.php事件
protected $message;
public function __construct($message)
{
$this->message = $message;
}
protected function prepareData()
{
return [
'chatID' => $this->message->chatID,
'userID' => $this->message->builderID,
'message' => $this->message->message,
];
}
public function broadcastWith()
{
return [
'message' => $this->prepareData(),
];
}
public function broadcastAs()
{
return 'new.message';
}
public function broadcastOn()
{
return new PrivateChannel('chat-'.$this->message->chatID);
}
BroadcastServiceProvider.php
public function boot()
{
Broadcast::routes( [ 'middleware' => [ 'api', 'auth.jwt' ] ] );
require base_path('routes/channels.php');
}
连接到前端的宽频道(正在接收消息)
Component.ts
window['Echo'] = new Echo({
broadcaster: 'socket.io',
host: 'http://app.test:6001',
auth:
{
headers:
{
'Authorization': 'Bearer ' + this.auth.jwt
}
}
});
window['Echo'].private(`chat-${this.chatUUID}`)
.listen(".new.message", (data) => {
this.messages.data.push(data.message);
});
答案 0 :(得分:0)
显然,问题不在于编程方面,而与您的Web服务器配置(或Web套接字服务器)有关。我认为您总是会通过身份验证专用通道,但不能通过/broadcusting/auth
进行身份验证,这很简单,因为响应会给您200条代码。如您在laravel-echo-server sourse中所看到的,渠道会残留身份验证。因此,您的routes/channels
可能不参与该过程。此外,如果您从配置中排除BroadcastServiceProvider
,则无论如何您都会获得对私有频道的身份验证。
如果一切都这样指示,我建议您看一下Web服务器的配置,尤其是在使用SSL的情况下。Alternative SSL implementation和laravel-echo-server.json
当然。