Laravel Broadcast - 结合多个中间件(web、auth:api)

sen*_*nty 5 middleware laravel laravel-events laravel-passport laravel-5.5

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

但是,如果我想像这样同时使用两者:

Broadcast::routes(['middleware' => ['auth:api', 'web']]); // doesn't work
Run Code Online (Sandbox Code Playgroud)

...它同时崩溃,我怀疑它假设我正在尝试为两个auth:api && web中间件启用。

有没有办法为此使用 OR 类型的语句(auth::api || 'web')?如果我想同时使用两者,并且如果它通过一个中间件,它会绕过中间件怎么办。

请注意,我的 api 使用的是 Laravel Passport。


或者有没有办法为两者结合并创建一个混合中间件(这将基本上检查 api 或 web)?所以我可以使用这样的东西:

Broadcast::routes(['middleware' => 'broadcast']); // or auth:broadcast
Run Code Online (Sandbox Code Playgroud)

更新:

据我了解,如果我创建一个名为 的新中间件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);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我该如何改变/broadcasting/auth路线呢?如果我试试这个:

Route::post('/realtime/auth', function(){
    return true;
})->middleware('broadcast');
Run Code Online (Sandbox Code Playgroud)

这将返回用户对象信息,但是,它应该返回如下内容: auth:"374f7ff42b7da877aa35:c29addedec281b418331a61dc3cfc74da8b108222565fa4924a8..."

Ale*_*ayo 9

为什么不在 BroadcastServiceProvider 中使用这样的东西?这将创建两个单独的端点,并分配了单独的中间件。

    Broadcast::routes(['middleware' => 'web']);

    Broadcast::routes(['prefix' => 'api', 'middleware' => 'api']);
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,我自己用过。尽管我必须将中间件指定为 'auth:api' 才能使其工作。谢谢! (2认同)
  • 这似乎比我的解决方案更优雅。不过我还没有亲自尝试过。 (2认同)