【发布时间】:2018-09-07 14:24:26
【问题描述】:
所以,正如我的标题所说,我想将 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() 为空,这会导致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
}
}
});
【问题讨论】:
-
可能不是问题:只是指出
date('Y-m-d G:i:s')这是我第一次看到有人使用G而不是H我不确定MySQL(或任何数据库)是否可以返回日期正确。 -
@cbaconnier 不用担心,它的工作原理就是这样
-
你可以使用 laravel 护照。这是 laravel 的 API 认证的默认设置。 laravel.com/docs/5.6/passport
-
@SjoerddeWit 嗯,好点,不知道 Laravel 的功能。感谢您指出这一点。
标签: php laravel broadcast laravel-5.6 pusher