Laravel对广播频道的授权无效

时间:2018-01-17 15:52:10

标签: laravel laravel-5 laravel-5.4

我正在尝试使用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);
  });

1 个答案:

答案 0 :(得分:0)

显然,问题不在于编程方面,而与您的Web服务器配置(或Web套接字服务器)有关。我认为您总是会通过身份验证专用通道,但不能通过/broadcusting/auth进行身份验证,这很简单,因为响应会给您200条代码。如您在laravel-echo-server sourse中所看到的,渠道会残留身份验证。因此,您的routes/channels可能不参与该过程。此外,如果您从配置中排除BroadcastServiceProvider,则无论如何您都会获得对私有频道的身份验证。

如果一切都这样指示,我建议您看一下Web服务器的配置,尤其是在使用SSL的情况下。Alternative SSL implementationlaravel-echo-server.json当然。