因此,正如我的书名所说,我想将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']);
放在BroadcastServiceProvider
中,则boradcasting/auth
会给出403
状态代码,因为$request->user()
为空,则结果为{{1 }}。
我曾尝试搜索整个该死的网站,但没有发现更改默认的身份验证中间件进行广播。
我什至尝试删除Access forbidden
并自定义一条新路由Broadcast::routes()
,该路由返回一个/broadcast
Pusher
对象,并且每次我得到一个socket_auth
状态代码。 / p>
任何想法,或者也许您可以指出我可以管理的方向? 谢谢!
以后编辑: 我的JS Echo连接看起来像这样:
419 Unkown
答案 0 :(得分:3)
我很高兴您能有所作为。对于以后的读者来说,这是解决问题的一种更Laravel的方式:创建一个custom auth guard来认证对特殊路由的请求。
Laravel的AuthManager
包括一个辅助方法viaRequest()
,该方法简化了Guard
的创建过程,该过程使用请求上下文中的数据对用户进行身份验证,而无需完全实现{{ 1}}。我们可以在 AuthServiceProvider.php 中的Illuminate\Contracts\Auth\Guard
方法中绑定我们的自定义防护:
boot()
我们可以看到,我们只是将闭包传递给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
。
接下来,我们将在 config / auth.php 中的null
数组中添加一个条目,向Laravel介绍我们的新身份验证防护:
'guards'
最后,我们需要更新所有中间件,以使用我们的自定义'guards' => [
...
'broadcasting' => [
'driver' => 'custom-auth',
],
],
来对用户进行身份验证的所有路由。我们可以使用Laravel的内置身份验证中间件,并指定要应用为middleware parameter的防护措施。例如,我们将在问题的 BroadcastServiceProvider.php 中初始化广播路由:
Guard
...其中Broadcast::routes([ 'middleware' => [ 'auth:broadcasting', ... ] ]);
与我们在 config / auth.php 中分配给自定义broadcasting
的名称匹配。
这种方法使我们能够使用Laravel的所有Guard
服务,为定义身份验证逻辑提供了更为集中的位置,并简化了自动测试,因为我们可以根据需要更轻松地模拟身份验证。
答案 1 :(得分:1)
我实际上设法找到了解决方案,所以我要做的就是通过以下操作将自定义$user
中间件中获得的auth
绑定到请求:
$request->merge(['user' => $user]);
//add this
$request->setUserResolver(function () use ($user) {
return $user;
});
,现在laravel检查的$request->user()
返回用户对象并通过验证。