如何更改 Laravel 的默认广播身份验证中间件
How to change Laravel's default broadcast auth middleware
因此,正如我的标题所说,我想将 Laravel 的默认 Broadcast
身份验证中间件更改为我制作的使用 token-based 身份验证的自定义身份验证中间件。我这样做是因为我的应用程序是一个 API-based 应用程序,并且当用户进行身份验证时,我创建一个 session 令牌并将其发送给他,并使用 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()
为空,然后会导致 Access forbidden
.
我已经尝试搜索整个该死的网络,但我没有找到任何关于更改广播的默认 auth 中间件的信息。
我什至尝试删除 Broadcast::routes()
并自定义一条新路线 /broadcast
返回 Pusher
socket_auth
object 每次我得到 419 Unkown
状态码。
有什么想法或者您可以指出我可以解决这个问题的方向吗?
谢谢!
稍后编辑:
我的 JS Echo 连接如下所示:
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
}
}
});
我实际上设法找到了解决方案,所以我需要做的就是通过执行以下操作将我在自定义 auth
中间件中获得的 $user
绑定到请求:
$request->merge(['user' => $user]);
//add this
$request->setUserResolver(function () use ($user) {
return $user;
});
现在 $request->user()
laravel 检查 returns 用户对象并通过验证。
我很高兴你有一些工作。对于后来的读者,这里有一个更 Laravel-esque 的方法来解决问题中的问题:创建一个 custom auth guard 用于验证对特殊路由的请求。
Laravel 的 AuthManager
包括一个辅助方法——viaRequest()
——它简化了 Guard
的创建,该方法使用请求上下文中的数据对用户进行身份验证,而无需需要完全实施 Illuminate\Contracts\Auth\Guard
。我们可以在AuthServiceProvider.php:
中的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()
方法,当认证成功时 returns 一个 User
对象,或者当认证失败时 null
。
接下来,我们将通过向 config/auth.php 中的 'guards'
数组添加一个条目来告知 Laravel 我们的新身份验证守卫:
'guards' => [
...
'broadcasting' => [
'driver' => 'custom-auth',
],
],
最后,我们需要为任何应该使用我们的自定义 Guard
验证用户身份的路由更新中间件。我们可以使用 Laravel 的内置身份验证中间件,并指定应用哪个守卫作为 middleware parameter。例如,我们将在问题的 BroadcastServiceProvider.php:
中初始化广播路由
Broadcast::routes([ 'middleware' => [ 'auth:broadcasting', ... ] ]);
...其中 broadcasting
匹配我们在 config/auth.php 中分配给自定义 Guard
的名称。
这种方法使我们能够使用 Laravel 的所有 Auth
服务,提供了一个更集中的位置来定义我们的身份验证逻辑,并简化了自动化测试,因为我们可以更轻松地模拟身份验证根据需要。
因此,正如我的标题所说,我想将 Laravel 的默认 Broadcast
身份验证中间件更改为我制作的使用 token-based 身份验证的自定义身份验证中间件。我这样做是因为我的应用程序是一个 API-based 应用程序,并且当用户进行身份验证时,我创建一个 session 令牌并将其发送给他,并使用 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()
为空,然后会导致 Access forbidden
.
我已经尝试搜索整个该死的网络,但我没有找到任何关于更改广播的默认 auth 中间件的信息。
我什至尝试删除 Broadcast::routes()
并自定义一条新路线 /broadcast
返回 Pusher
socket_auth
object 每次我得到 419 Unkown
状态码。
有什么想法或者您可以指出我可以解决这个问题的方向吗? 谢谢!
稍后编辑: 我的 JS Echo 连接如下所示:
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
}
}
});
我实际上设法找到了解决方案,所以我需要做的就是通过执行以下操作将我在自定义 auth
中间件中获得的 $user
绑定到请求:
$request->merge(['user' => $user]);
//add this
$request->setUserResolver(function () use ($user) {
return $user;
});
现在 $request->user()
laravel 检查 returns 用户对象并通过验证。
我很高兴你有一些工作。对于后来的读者,这里有一个更 Laravel-esque 的方法来解决问题中的问题:创建一个 custom auth guard 用于验证对特殊路由的请求。
Laravel 的 AuthManager
包括一个辅助方法——viaRequest()
——它简化了 Guard
的创建,该方法使用请求上下文中的数据对用户进行身份验证,而无需需要完全实施 Illuminate\Contracts\Auth\Guard
。我们可以在AuthServiceProvider.php:
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()
方法,当认证成功时 returns 一个 User
对象,或者当认证失败时 null
。
接下来,我们将通过向 config/auth.php 中的 'guards'
数组添加一个条目来告知 Laravel 我们的新身份验证守卫:
'guards' => [
...
'broadcasting' => [
'driver' => 'custom-auth',
],
],
最后,我们需要为任何应该使用我们的自定义 Guard
验证用户身份的路由更新中间件。我们可以使用 Laravel 的内置身份验证中间件,并指定应用哪个守卫作为 middleware parameter。例如,我们将在问题的 BroadcastServiceProvider.php:
Broadcast::routes([ 'middleware' => [ 'auth:broadcasting', ... ] ]);
...其中 broadcasting
匹配我们在 config/auth.php 中分配给自定义 Guard
的名称。
这种方法使我们能够使用 Laravel 的所有 Auth
服务,提供了一个更集中的位置来定义我们的身份验证逻辑,并简化了自动化测试,因为我们可以更轻松地模拟身份验证根据需要。