我正在使用Laravel事件广播和Pusher来利用Websockets,既可以在我的API上使用,也可以在Web上使用。如果我分别尝试它们,两者都可以正常工作。我的意思是:
Broadcast::routes(['middleware' => 'web']); // this works for my Laravel website
Broadcast::routes(['middleware' => 'auth:api']); // this works for my api
然而,如果我想像这样同时使用它们:
Broadcast::routes(['middleware' => ['auth:api', 'web']]); // doesn't work
... 对于两者都会崩溃,我怀疑它认为我正在尝试启用两个中间件 auth:api && web
。
有没有一种使用 OR 类型语句的方法 (auth::api || 'web'
)? 如果我想同时使用两个中间件,并且如果它通过一个中间件,它将绕过中间件。
请注意,我正在使用 Laravel Passport 作为我的 API。
还有一种方法可以将两个中间件组合并创建混合中间件吗 (这将基本上检查 api 或 web)? 所以我可以使用类似这样的东西:
Broadcast::routes(['middleware' => 'broadcast']); // or auth:broadcast
更新:
据我所知,如果我创建一个名为broadcast
的新中间件,我可以执行以下操作:
class BroadcastMiddleware() {
public function handle() {
$web = Auth::guard('web')->user();
if ($web) {
return response()->json($web);
}
$api = Auth::guard('api')->user();
if ($api) {
return response()->json($api);
}
return response()->json('Unauthorized.', 500);
}
}
那么我该如何更改/broadcasting/auth
路由呢?如果我尝试这样做:
Route::post('/realtime/auth', function(){
return true;
})->middleware('broadcast');
这将返回用户对象信息,然而,它应该返回像这样的内容:
auth:"374f7ff42b7da877aa35:c29addedec281b418331a61dc3cfc74da8b108222565fa4924a8..."
。