如何更改 Laravel 的默认广播身份验证中间件



所以,正如我的标题所说,我想将 Laravel 的默认Broadcast身份验证中间件更改为我制作的自定义身份验证中间件,该中间件使用基于令牌的身份验证。我这样做是因为我的应用程序是基于 API 的应用程序,当用户进行身份验证时,我会创建一个会话令牌并将其发送给他,并将其存储在带有expires_at列的数据库中。 我正在使用Pusher.

我有以下中间件:

class AuthCustom
{
public function handle($request, Closure $next)
{
// if we have the session token stored in header
if ($request->header('x-session')) {
$session = Session::where('id', $request->header('x-session'))->where('expires_on', '>=', date('Y-m-d G:i:s'))->with('user')->first();
if ($session !== null) {
$user = (new User())->where('id', $session->user_id)->first();
if ($user !== null) {
$request->merge(['user' => $user]);
return $next($request);
}
}
}
}

我的BroadcastServiceProvider代码如下:

class BroadcastServiceProvider extends ServiceProvider
{
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}

如果我把Broadcast::routes(['middleware' => 'authcustom']);放在BroadcastServiceProviderboradcasting/auth会给出一个403状态代码,因为$request->user()为空,然后导致Access forbidden

我尝试搜索整个该死的网络,但我没有发现任何关于更改广播的默认身份验证中间件的信息。

我什至尝试删除Broadcast::routes()并自定义一个新的路由/broadcast,该路由返回一个Pushersocket_auth对象,每次我都会收到一个419 Unkown状态代码。

任何想法,或者也许您可以指出我可以管理的方向? 谢谢!

后期编辑: 我的 JS 回显连接如下所示:

Vue.use(VueEcho, {
broadcaster: 'pusher',
key: 'xxxxxxxxxxxxxx',
cluster: 'eu',
authEndpoint: 'http://localhost/api.easycargo.ro/public/broadcasting/auth',
auth: {
headers: {
'x-session': this.auth.token
}
}
});

我很高兴你有一些工作。对于后来的读者,这里有一种更像 Laravel 式的方法来解决问题:创建一个自定义身份验证保护,用于对特殊路由的请求进行身份验证。

Laravel 的AuthManager包括一个辅助方法(viaRequest()(,该方法简化了使用请求上下文中的数据对用户进行身份验证的Guard的创建,而无需完全实现IlluminateContractsAuthGuard。我们可以在AuthServiceProviderboot()方法中绑定我们的自定义保护.php:

public function boot()
{
Auth::viaRequest('custom-auth', function ($request) {
// Any custom user-lookup logic here. For example:
if ($request->header('x-session')) {
$user = // ...try to fetch a user...
return $user;
}
});
}

如我们所见,我们只是将一个闭包传递给viaRequest()方法,该方法在身份验证成功时返回一个User对象,或者在身份验证失败时返回null对象。

接下来,我们将通过在config/auth.php中的'guards'数组中添加一个条目来告诉 Laravel我们的新身份验证保护:

'guards' => [ 
...
'broadcasting' => [
'driver' => 'custom-auth', 
],
],

最后,我们需要更新任何路由的中间件,这些路由应使用我们的自定义Guard对用户进行身份验证。我们可以使用 Laravel 的内置身份验证中间件,并指定要应用哪个保护作为中间件参数。例如,我们将初始化问题的广播服务提供程序.php中的广播路由:

Broadcast::routes([ 'middleware' => [ 'auth:broadcasting', ... ] ]);

。其中broadcasting与我们在config/auth.php中分配给自定义Guard的名称匹配。

这种方法使我们能够使用Laravel的所有Auth服务,提供一个更中心的位置来定义我们的身份验证逻辑,并简化自动化测试,因为我们可以根据需要更轻松地模拟身份验证。

我实际上设法找到了一个解决方案,所以我需要做的就是通过执行以下操作将我在自定义auth中间件中获得的$user绑定到请求:

$request->merge(['user' => $user]);
//add this
$request->setUserResolver(function () use ($user) {
return $user;
});

现在$request->user()哪个 Laravel检查返回用户对象并通过验证。

相关内容

最新更新