首先,因为重写了 axios 的拦截器,为了确保 socket 消息头的引入,在 axios 拦截器中中加入

1
2
3
4
5
6
7
8
if(window.Echo)
{
let socketId = window.Echo.socketId()
if (socketId)
{
request.headers.common['X-Socket-Id'] = socketId
}
}

然后,修改BroadcastServiceprovider,修改认证路由为api模组

1
Broadcast::routes(["prefix" => "api", "middleware" => "api"]);

最后,在 laravel-echo-server.json 中确保认证路由的正确

1
2
3
4
{
"authHost": "http://dev.test",
"authEndpoint": "/api/broadcasting/auth"
}

同时,在 Laravel Echo中加入token认证

1
2
3
4
5
6
7
8
import Cookies from 'js-cookie'

let token = Cookies.get('token')
window.Echo = new Echo({
broadcaster: 'socket.io',
host: process.env.MIX_ECHO_SERVER,
auth: { headers: { 'Authorization': 'Bearer ' + token } }
})

好了,我们现在可以愉快的使用 laravel 发送广播了,私有频道在 routes/channels.php 中编写认证权限

在前端使用 Laravel Echo 监听私有频道时,只有通过 laravel echo server 认证的私有频道才会建立监听,并收听到广播