这个问题是很久以前提出的,但我希望它对某人有用。我在使用独立 SPA (Vue.js) 和 REST API (Laravel) 时遇到了同样的问题。为了简化实时评论系统的实现,我使用了 laravel-echo和 pusher.js。为了解决这个问题,我根据“自定义授权端点章节”指定了身份验证端点
https://laravel.com/docs/8.x/broadcasting#customizing-the-authorization-endpoint
我使用了以下方法:
authEndpoint: process.env.VUE_APP_API_ROOT + '/broadcasting/auth'
其中 VUE_APP_API_ROOT 是“http://api.yoursite.dev
但后来我遇到了 CORS 的新问题。我对 API 端点和来自https://github.com/fruitcake/laravel-cors包的中间件使用 JWT 身份验证,该包允许指定“Access-Control-Allow-Origin”标头以解决 SPA 发送请求时的 CORS 问题来自不同域的 API。
因此,为了解决 CORS 和身份验证问题,我将广播路由添加到 api.php 并设置 JWT 身份验证中间件
Broadcast::routes(['middleware' => ['auth.jwt:api']]);
并使用 Laravel echo 设置自定义 Pusher 授权方
window.Echo = new Echo({
broadcaster: "pusher",
cluster: process.env.VUE_APP_PUSHER_APP_CLUSTER,
encrypted: true,
key: process.env.VUE_APP_PUSHER_APP_KEY,
authorizer: (channel, options) => {
return {
authorize: (socketId, callback) => {
axios.post(process.env.VUE_APP_API_ROOT + '/api/broadcasting/auth', {
socket_id: socketId,
channel_name: channel.name
})
.then(response => {
callback(false, response.data);
})
.catch(error => {
callback(true, error);
});
}
};
},
})
PS 为了向 axios 提供 JWT 令牌,我使用了允许从 Vuex 获取令牌的 axios 拦截器。
axios.interceptors.request.use(config => {
const token = store.getters['auth/accessToken'];
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
});