Lui*_*uiz 2 php socket.io laravel
如何使用自定义auth方法向通道认证用户?
例如,在我的应用程序中,我对API使用令牌身份验证(存储在每个用户的数据库中),该身份验证通过标头传递并由自定义中间件读取。
如何使用这些通道的自定义身份验证方法来控制访问?客户端和服务器端将如何?我正在使用socket.io,而Laravel文档尚不清楚auth方法如何用于套接字。
使用案例:
我有使用默认Laravel迁移存储在数据库中的用户。但是,我的应用只是API,它是无状态的,因此remember_token,我使用它来存储在登录端点中生成的唯一身份验证令牌,而不是用来存储会话令牌。
API的每个端点,请求都通过中间件传递,在中间件中,头中存在的令牌可检索用户
$token = Request::header('X-token');
$request->user = User::findByToken($token);
return $next($request);
Run Code Online (Sandbox Code Playgroud)
现在问题来了。Laravel文档尚不清楚私有渠道的工作方式。
广播客户端将如何传递上述令牌并获得加入指定频道的授权?
关于广播的Laravel文档对此非常全面,尽管没有详细介绍它不支持的客户端库。
在
BroadcastServiceProviderLaravel应用程序随附的软件中,您将看到对该Broadcast::routes方法的调用 。此方法将注册/broadcasting/auth路由以处理授权请求
定义广播路由时,当前经过身份验证的用户将作为参数自动传递。由于您要在广播路由定义之前更改身份验证机制,以便传递正确的用户,因此广播客户端将传递令牌(但是您喜欢-HTTP标头,URL参数,POST数据等)。然后您将自定义/broadcasting/auth路由以解析该数据并使用它来验证用户身份。从那里开始,您将使用标准Broadcast::channel()定义来确保经过身份验证的用户也是该通道上的授权用户。
根据文档,使用中间件作为Broadcast::routes()一个可选数组。从来源:$attributesweb
$attributes = $attributes ?: ['middleware' => ['web']];
Run Code Online (Sandbox Code Playgroud)
因此,如果您愿意,可以'api'通过将中间件身份验证传递给Broadcast::routes()调用(或任何其他标准路由参数)来将其更改为。
由于已经为您创建了路由,因此,如果您想在路由功能/中间件的较低级别对其进行自定义,则需要auth()在BroadcastProvider所使用的任何位置上更改方法。更具体地说,在设置路线时,它将在authenticate()上调用方法BroadcastController,而该auth()方法Broadcast又仅在facade 上调用方法。然后,Facade会调用您正在使用的任何提供程序- 现成的定义了一些提供程序,如果您要编写自己的提供程序,则应该为您提供一个良好的起点。话虽如此,只要您对提供程序本身没有任何问题,编写自己的中间件并将其传递给Broadcast::routes()如果您需要身份验证中的一些特殊内容(如果它与api身份验证中间件不同),则将其作为属性。
另外,由于您已经用socket.io标记了它,因此您可能还想阅读Laravel Echo。socket.io在广播简介中也有一节专门讨论。
除了 Leith 的回答之外,那些挠头并想知道为什么创建自定义中间件并使用它BroadcastServiceProvider.php会抛出错误的人。
public function boot()
{
Broadcast::routes(['middleware' => ['custom.middleware']]);
require base_path('routes/channels.php');
}
Run Code Online (Sandbox Code Playgroud)
内部Broadcaster.php有一个被调用的方法retrieveUser(),该方法应该return $request->user()是您的自定义中间件中成功进行身份验证的结果。
就我而言,我试图传递access token给 API 的自定义中间件;一旦验证了用户的身份,我就简单地传递了我的原始请求return $next($request)
为了使上面的代码正常工作,我必须获取模型user,access token然后将其合并到原始请求中,如下所示
$request->merge(['user' => $user ]);
$request->setUserResolver(function () use ($user) {
return $user;
});
return $next($request);
Run Code Online (Sandbox Code Playgroud)
因此,现在retrieveUser()方法 fromBroadcaster.php能够使用命令检索经过身份验证的用户,并将其作为第一个参数return $request->user()传递给方法Broadcast::channel
Broadcast::channel('private-channel-name', function ($user) {
// if you get here, you've been authenticated (within a custom middleware)
return true;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3773 次 |
| 最近记录: |