php - 如何更改 Laravel 的默认广播授权中间件

标签 php laravel broadcast laravel-5.6 pusher

所以,正如我的标题所说,我想更改 Laravel 的默认值 Broadcast身份验证中间件到我制作的使用基于 token 的身份验证的自定义身份验证中间件。我这样做是因为我的应用程序是基于 API 的应用程序,并且当用户进行身份验证时,我创建一个 session token 并将其发送给他,并将其存储在数据库中,并带有 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 .

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

我什至尝试删除 Broadcast::routes()并定制一条新路线/broadcast它返回了 Pusher socket_auth对象,每次我得到一个 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
        }
    }
});

最佳答案

我很高兴你有一些工作。对于后来的读者,这里有一个更 Laravel 式的方法来解决问题中的问题:创建一个 custom auth guard用于验证对特殊路由的请求。

Laravel 的 AuthManager包括一个辅助方法— viaRequest() —这简化了 Guard 的创建使用来自请求上下文的数据对用户进行身份验证,而无需完全实现 Illuminate\Contracts\Auth\Guard .我们可以在 boot() 中绑定(bind)我们的自定义守卫AuthServiceProvider.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当认证失败时。

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

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

最后,我们需要为应该使用我们自定义的 Guard 对用户进行身份验证的任何路由更新中间件。 .我们可以使用 Laravel 内置的 auth 中间件,并指定应用哪个守卫作为 middleware parameter .例如,我们将在问题的 BroadcastServiceProvider.php 中初始化广播路由:

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

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

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

关于php - 如何更改 Laravel 的默认广播授权中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52224576/

相关文章:

php - 保存数组位置

php - 从 Carbon 类对象获取元素

javascript - 如何隐藏 Angular 管理 View

php - mysql 改变表顺序不工作

android - NFC广播问题

php - 在 PHP 中使用订阅选项将日历公开为 iCal

php - 如何使用 PHP 和 Ajax 将表单数据插入 MySQL 数据库表中?

android - 将广播从一个 apk/包发送到另一个 apk/包

python - 向所有 worker 广播任务 : redis+celery

PHP - mysql_fetch_assoc() 问题