当前位置: 首页 > 知识库问答 >
问题:

Laravel广播认证

咸亦
2023-03-14

如何使用自定义身份验证方法对通道的用户进行身份验证?

例如,在我的应用程序中,我为我的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对私人频道的运作方式并不十分清楚。

广播客户端如何传递所述令牌并获得加入给定频道的授权?

共有2个答案

罗智刚
2023-03-14

在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()方法。php能够通过return$request检索经过身份验证的用户-

Broadcast::channel('private-channel-name', function ($user) {
    // if you get here, you've been authenticated (within a custom middleware)
    return true;
});

享受

郑茂勋
2023-03-14

关于广播的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,则在计算中可它。 如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。 数