如何在 Docker 環境的 Laravel Echo Server 建立 Private Channel

繼上篇「Laravel 如何使用 Docker 快速架起 Echo Server」後,原以為事情一切順遂,可以開始使用廣播功能了。

結果天不從人願,因為即時訊息必須得用 Private Channel 來做,結果馬上發現一個問題:Echo Server 沒辦法做身分驗證,導致 Private Channel 及 Presence Channel 都無法使用。前前後後搞了一天時間才發現是 Laradock 本身的設定問題,因此紀錄下解決過程,我也會在發出這篇文章後向 Laradock 官方發 PR。


首先我們在 BroadcastEvent 中,將 broadcastOnChannel 改為 PrivateChannel

class BroadcastEvent implements ShouldBroadcast
{
    ...

    public function broadcastOn()
    {
        return new PrivateChannel('App.User.1');
    }
    ...
}

然後在 routes/channels.php 中,加入以下程式碼

Broadcast::channel('App.User.{id}', function ($user, $id) {
    return true;
});

並在 config/app.php 中,將 BroadcastServiceProvider 取消註解

...
App\Providers\BroadcastServiceProvider::class,
...

在 Receiver.vue 中,將 Channel 改為 private,並修改 Channel 名稱

Echo.private('App.User.5')
    .listen('BroadcastEvent', (e) => {
        this.messages.push(e.message);
    });

這時候應該就要連上了

但是沒有,頁面刷新之後完全沒有接收到訊息,也清過 Cache、看過錯誤日誌,就是完全看不出異狀,直到打開 Echo Server 的 log 才發現問題

$ docker-compose logs laravel-echo-server


若我把 Echo Server 的 authHost 改為 laravel.test 則會出現另一種錯誤訊息

但我 Google 了很久都沒人碰到這狀況,直到看到其中一篇官方 Issue

Laravel-echo-server running in docker, resolve the local address as IP ! · Issue #72

裡面提到他懷疑因為 Echo Server 的 authHost 指向 127.0.0.1 導致無法驗證,因此他把 authHost 改為 http://www.google.com 後就出現不同的錯誤訊息,確認是這個原因造成,他再進一步把 authHost 改為本機的 LAN IP 就驗證通過了。

因此我們可以知道:authHost 是指他會連到該主機上去驗證使用者身分,也就是我們 Laravel 應用程式的位置

但我在照著操作的過程還是碰到問題,就算我把 authHost 改為我的網路位置仍然沒辦法,但給了我一個想法:Laravel 應用程式的位置在 Nginx container 的 80 port 上,那若把驗證的位置指向 Nginx container 呢?,因此我們可以將 Echo Server 的配置修改如下:

// laradock/laravel-echo-server/laravel-echo-server.json
...
   "authHost": "http://nginx", 將 authHost 改為 nginx
...
// laradock/docker-compose.yml
...
### Laravel Echo Server #######################################
    laravel-echo-server:
      build:
        context: ./laravel-echo-server
      volumes:
        - ./laravel-echo-server/laravel-echo-server.json:/app/laravel-echo-server.json:ro
      ports:
        - "${LARAVEL_ECHO_SERVER_PORT}:6001"
      links:
        - redis
        - nginx // 將 nginx link 加入 laravel-echo-server
      networks:
        - frontend
        - backend
...

再重新 build Laravel Echo Server

$ docker-compose down
$ docker-compose build laravel-echo-server
$ docker-compose up -d laravel-echo-server nginx redis php-worker

刷新頁面後再次打開 Echo Server 的 log 就可以看到終於驗證成功了 ?

部落格文章:https://bit.ly/2Jwdm2X

本作品采用《CC 协议》,转载必须注明作者和本文链接

簡永哲 Leo Chien
IT Director | 大師鏈 MasterChain
E: s950329@hotmail.com

本帖由系统于 4个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

非常感谢, 整了老半天了,墙内墙外都翻了个遍, 看到这篇文章之后终于调通了

1年前 评论
leochien

@MR_NOBODY 很高興幫到你

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!