我目前正在我的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上授权,而不在单个通道路由上授权?
经过大量搜索,我发现问题出在我的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\可验证的
接口。请记住为getAuthIdfierName
和getAuth标识符
添加功能,以分别返回用户名和用户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,以便其他线程可以执行写入。我有