为什么Laravel私有广播频道授权失败,routes/channels.php配置不生效?
问题原因
- 核心原因是
Broadcast::routes()默认使用web中间件组,而你使用Sanctum做SPA身份认证,前端广播认证请求走的是API链路,没有web中间件依赖的会话上下文,导致Laravel无法解析出当前登录用户,执行channels.php中的频道回调时$user参数为空,直接返回403未授权。 - 你将频道定义移到api.php后功能正常,是因为api.php默认加载
api中间件组,会通过Sanctum校验请求身份,正常解析出登录用户,所以回调能正常执行。
解决方案(保留channels.php中的频道定义)
修改app/Providers/BroadcastServiceProvider.php中的boot方法,给Broadcast::routes()指定适配Sanctum的中间件即可:
public function boot() { // 手动指定广播路由使用api+Sanctum认证中间件 Broadcast::routes(['middleware' => ['api', 'auth:sanctum']]); require base_path('routes/channels.php'); }
额外校验项
- 确认
config/cors.php中已经将broadcasting/auth路径加入paths数组,允许跨域请求 - 确认你的SPA访问域名已经加入
config/sanctum.php的stateful配置项,前端请求头携带正确的X-XSRF-TOKEN
内容的提问来源于stack exchange,提问作者Mg Mg Tint
相关产品推荐
相关产品推荐

