我正在使用 Laravel Event Broadcast 和 Pusher 在我的 API 和 Web 上使用 websocket。如果我单独尝试它们,两者都可以正常工作。我的意思是:
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..."