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

Nuxt网络插座Laravel回声私人通道身份未触发

满博
2023-03-14

我目前正在我的Nuxt应用程序中实现WebSocket。我有一个Laravel后端,我使用Pusher和Laravel Echo。问题是,当尝试连接/订阅专用频道时,由于客户端通过广播/authendpoint获得授权,因此未命中单个频道的auth(channels.php)。因此,登录用户有可能访问他们不应该访问的私有通道。

我的代码/配置如下:

NUXT前端:

努克斯。配置。js

echo: {
 broadcaster: 'pusher',
 key: process.env.MIX_PUSHER_APP_KEY,
 cluster: process.env.MIX_PUSHER_APP_CLUSTER,
 forceTLS: process.env.NODE_ENV === 'production',
 authModule: true,
 authEndpoint: `${process.env.API_URL}/broadcasting/auth`,
 connectOnLogin: true,
 disconnectOnLogout: true,
 auth: {
  headers: {
    'X-AUTH-TOKEN': process.env.API_AUTH_TOKEN
  }
 }

},

拉威尔后退:

BroadcastServiceProvider.php

public function boot()
{
    Broadcast::routes(['middleware' => [JWTAuthMiddleware::class]]);

    require base_path('routes/channels.php');
}

授权控制器。php

public function auth(Request $request): JsonResponse
{
    $pusher = new Pusher(
        config('broadcasting.connections.pusher.key'),
        config('broadcasting.connections.pusher.secret'),
        config('broadcasting.connections.pusher.app_id')
    );
    $auth = $pusher->socket_auth($request->input('channel_name'), $request->input('socket_id'));
    return ResponseHandler::json(json_decode($auth));
}

聊天信息vent.php

/**
 * @inheritDoc
 */
public function broadcastOn()
{
    return new PrivateChannel('chat.' . $this->chatMessage->getChatId());
}

频道。php

Broadcast::channel(
'chat.{chatId}',
function (JwtUserDTO $user, int $chatId) {
    Log::info('test');
    return false;
}

);

正如您可能已经注意到的,我们使用存储在客户端的JWT auth策略,因此我们没有会话。但是,随着通过authendpoint进行授权的工作,应该可以通过这些通道保护各个私有通道。php路由?但正如我在日志中看到的,它从未到达。我是否缺少一些配置?或者,为什么我只在身份验证endpoint上授权,而不在单个通道路由上授权?

共有1个答案

宣弘新
2023-03-14

经过大量搜索,我发现问题出在我的AuthController上。php因为我已经实现了我自己的auth函数,这使得它能够对用户进行私有通道的身份验证。不幸的是,这导致没有向BroadcastServiceProvider征税。因此,解决办法是:

use Illuminate\Broadcasting\BroadcastController;

Route::post('broadcasting/auth', [BroadcastController::class, 'authenticate'])
        ->middleware(BroadcastMiddleware::class);

这将使用广播门面并启用频道的使用。php,用于根据给定通道对用户进行身份验证。

我还必须添加一个中间件来设置Laravel会话中经过身份验证的用户,因为这是服务提供商所需要的。

/**
 * @param Request $request
 * @param Closure $next
 * @return mixed
 */
public function handle(Request $request, Closure $next)
{
    /** @var JwtUserDTO $jwt */
    $jwt = $request->get('jwt');
    // Set the user in the request to enable the auth()->user()
    $request->merge(['user' => $jwt]);
    $request->setUserResolver(function() use ($jwt) {
        return $jwt;
    });
    Auth::login($jwt);

    return $next($request);
}

要做到这一点,在我的例子中,模型或DTO必须实现Illumate\合同\Auth\可验证的接口。请记住为getAuthIdfierNamegetAuth标识符添加功能,以分别返回用户名和用户ID,因为如果您想玩存在通道,这也是必需的。

 类似资料:
  • 我正在尝试创建一个实时聊天应用程序。我使用了Laravel Echo、Redis和socket io。 但是没有收听私人广播聊天频道。 应用程序事件消息推送

  • 我试图了解Socketchannes和NIO的总体情况。我知道如何使用常规套接字,以及如何为每个客户机服务器创建一个简单的线程(使用常规阻塞套接字)。 所以我的问题是: 什么是袜子通道 当我使用SocketChannel而不是Socket时,额外得到了什么 通道和缓冲区之间的关系是什么 什么是选择器 文档中的第一句话是

  • 我正在尝试使用专用通道验证laravel echo。每次我收到“无法验证到private-U详细信息。1”。“basket_details”这是通道名称,1是参数。 当我使用公共频道时,一切都很完美。因此,我认为auth部分存在一些问题。 这是我的错误日志 这是我的事件文件。 这是我的频道。php 这是我的js文件 这是我的BroadcastServiceProvider 这是我的laravel

  • 我正在使用lemmingzshadow(web)的PHP Websocket服务器。直到现在一切都很顺利。 更新到chrome 20后,如果我想与服务器握手,它以以下错误结束 来自chrome 20的标题 返回的标题: 我认为问题在于Chrome20的“Sec WebSocket Extensions:x-webkit-deflate-frame”标题。 你知道如何让它重新工作吗?

  • 我是enterprise social network product的开发人员,我正在开发一个非常类似于Facebook通知的功能。我们想为我们的客户提供一个实时的通知机制。 我正在Node.js中构建一个通知服务,我的系统可以与它交互并通知它。最大的问题是:

  • 我正在编写一个netty/websocket服务器应用程序,其中对websockent客户端(例如浏览器)的写入来自另一个线程(即不是来自websockets)。 这是netty4.0.18.Final,我的应用程序在很大程度上基于提供的websocket服务器示例。 我需要知道websocket通道何时打开,以便我可以保存ChannelHandlerContext,以便其他线程可以执行写入。我有