如何使用自定义身份验证方法对通道的用户进行身份验证?
例如,在我的应用程序中,我为我的API使用令牌认证(存储在每个用户的数据库中),通过标头传递,并由自定义中间件读取。
如何使用这些通道的自定义身份验证方法控制访问?客户端和服务器端如何?我使用socket.io和Laravel文档非常不清楚授权方法是如何工作的套接字。
使用案例:
我使用默认的Laravel迁移将用户存储在DB中。然而,我的应用程序只是API,它是无状态的,因此,我使用它来存储登录endpoint中生成的唯一身份验证令牌,而不是使用membere_token
来存储会话令牌。
在API的每一个endpoint,请求通过一个中间件,在中间件中,用户由标头中的令牌检索
$token = Request::header('X-token');
$request->user = User::findByToken($token);
return $next($request);
现在问题来了。Laravel docs对私人频道的运作方式并不十分清楚。
广播客户端如何传递所述令牌并获得加入给定频道的授权?
在Leith的回答之上,那些挠头并想知道为什么要创建自定义中间件并在BroadcastServiceProvider中使用它的人。php将抛出一个错误。
public function boot()
{
Broadcast::routes(['middleware' => ['custom.middleware']]);
require base_path('routes/channels.php');
}
内部
广播机。php
有一个名为retrieveUser()
的方法,它应该返回$request-
在我的例子中,我试图将
访问令牌
传递给API的自定义中间件;一旦验证了用户,我就简单地传递了我最初的请求返回$Next($请求)
为了让上面的代码正常工作,我必须通过
访问令牌
获取用户
模型,然后像这样将其合并到原始请求中
$request->merge(['user' => $user ]);
$request->setUserResolver(function () use ($user) {
return $user;
});
return $next($request);
现在,请从
Broadcaster获取
能够通过retrieveUser()
方法。phpreturn$request检索经过身份验证的用户-
Broadcast::channel('private-channel-name', function ($user) {
// if you get here, you've been authenticated (within a custom middleware)
return true;
});
享受
关于广播的Laravel文档非常全面,尽管它没有详细介绍它不支持的现成客户机库。
在这种情况下,您需要授权频道的部分。从文档:
在Laravel应用程序附带的BroadcastServiceProvider
中,您将看到对Broadcast::routes
方法的调用。此方法将注册/broadcasting/auth
路由以处理授权请求
定义广播路由时,当前经过身份验证的用户将作为参数自动传递。由于您希望在广播路由定义之前更改身份验证机制,以便传递正确的用户,因此您的广播客户端将传递令牌(不管您喜欢什么-HTTP头、URL参数、POST数据等)然后您可以自定义/broadcasting/auth
路由来解析数据并使用它来验证用户。从那里,您可以使用标准的Broadcast::channel()
定义来确保经过身份验证的用户也是该频道上的授权用户。
根据文档,Broadcast::routes()
采用可选的$attributes
数组来使用web
中间件。来源:
$attributes = $attributes ?: ['middleware' => ['web']];
因此,如果愿意,可以将中间件身份验证更改为'api'
,方法是将其传递给Broadcast::routes()
调用(或任何其他标准路由参数)。
由于已经为您创建了路由,如果您想在路由功能/中间件的较低级别对其进行自定义,则需要在您使用的BroadcastProvider
上更改auth()
方法。更具体地说,当路由被设置时,它调用BroadcastController
上的authenticate()
方法,而该方法又简单地调用Broadcast
外观上的auth()
方法。然后facade将调用您正在使用的任何一个提供程序——有几个提供程序是现成定义的,如果您想编写自己的,这将为您提供一个良好的起点。也就是说,只要提供者本身没有问题,如果您的身份验证需要特定的内容(如果它与api
身份验证中间件不同),那么编写自己的中间件并将其作为属性传递给Broadcast::routes()
可能会更容易。
作为额外的,因为你已经用套接字标记了这个。io,你可能还想了解一下Laravel Echo。还有一节是关于与socket对话的。io
特别是在广播导言中。
前言 在现代的 web 应用程序中,WebSockets 被用来实现需要实时、即时更新的接口。当服务器上的数据被更新后,更新信息将通过 WebSocket 连接发送到客户端等待处理。相比于不停地轮询应用程序,WebSocket 是一种更加可靠和高效的选择。 我们先用一个电子商务网站作为例子来概览一下事件广播。当用户在查看自己的订单时,我们不希望他们必须通过刷新页面才能看到状态更新。我们希望一旦有更
我刚刚开始使用广播与推动者和回声。我的问题是,我得到了一个错误,我找不到如何解决它。错误信息看起来很直接,但是我不知道应该去哪里处理它。 我的laravel是laravel 5.3的升级版。我将。我创建了一个事件并设置了专用频道<代码>返回新的PrivateChannel(“经销商”。$this- 我加了这个bootstrap.js 我还将所有内容添加到了。环境文件。最后,我在applayout的
活动是: 路线/频道。php是: 在刀片文件中: 广播频道工作正常。但在私密频道里,这是行不通的。并且在控制台中没有显示任何错误 我使用拉威尔回声和推进器
我正在遵循Laravel文档来设置使用推送器的广播,它看起来很简单,但是我还没有得到它的工作,所以我一定是在路上的某个地方犯了一个错误。 以下是我所做的: 服务器端 我创建了一个,它实现了接口,并定义了方法。 我正在从我的一个API控制器引发事件: 我已经在我的文件中配置了推进器凭据。 客户端 我已经在客户端配置了Laravel Echo(通过angular Laravel Echo包),并将我的
我使用Laravel回声和推进器作为我的服务器。它已经在公共频道上工作了。 这是我的laravel echo listener图像链接的照片 现在我的问题是,当我使用PrivateChannel时,当我在PrivateChannel中侦听时,会弹出以下错误: 邮递http://localhost:3000/broadcasting/auth 500(内部服务器错误) 在控制台/网络选项卡中的错误中
输出如下: 如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。 如果满足以下规则,可以进行广播: 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。 如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。 数