gpt4 book ai didi

node.js - 如何保护 Redis 和 Socket.IO 实时服务器,以便只有经过身份验证的用户才能收听?

转载 作者:可可西里 更新时间:2023-11-01 11:16:18 25 4
gpt4 key购买 nike

我正在构建一个具有聊天功能的网络应用程序。我在后端使用 Laravel 5.4,在前端使用 Angular 4。

一切正常(意味着我可以广播和接收),但我完全不确定如何保护它。聊天将始终是 1 对 1,因此它是私密的并且必须是安全的。每个聊天室都有一个唯一的 ID,但仍然有人可以收听。

目前,当我从前端向我的 API 发出请求时,我正在使用 JWT 进行身份验证,但我不确定是否可以为此实现类似的东西。我知道我可以使用 query 选项从前端传递 token ,但我不确定如何解析它,我也不确定如何验证它确实属于正在尝试的用户访问聊天(我应该向 API 发出请求以在 server.js 中进行验证吗?这似乎效率不高。将 token 的用户 ID 与用户 ID 进行比较是否足够好将在数据中传递?)

如果有人有任何建议或知道更好的方法,将不胜感激

发布新消息时从 Laravel 触发的事件

class NewMessage implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
$this->data = array(
'message'=> 'hi'
);
}

/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('chat');
}

}

server.js (node.js)

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();

redis.psubscribe('private-chat', function(err, count) {
console.log('psubscribe');
});


redis.on('pmessage', function(subscribed, channel, message) {
console.log('pmessage', subscribed, channel, message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function(){
console.log('Listening on Port 3000');
});

前端组件

socket: io.Socket;
this.socket = io.connect("http://webapp.test:3000", { query: this.token });
this.socket.on("private-chat:App\\Events\\NewMessage", (data) =>
{
console.log("Data", data);
});

最佳答案

尽量使用SSL(保密)

我们所知道的 SSL 确保您与之通信的服务器实际上是您想要的网络服务。

身份验证(避免certificate pinning)

在你使用 JWTHS256 的情况下,你需要 authentication,我强烈建议你使用 RS256 algorythm JWT 在这种情况下使用私钥和公钥。

如果您不确定对方是谁(身份验证),那么没有人能听到你们两人之间的对话也没关系。

因为我构建应用程序的方式是,如果未设置两个 channel 之间的 session authentication,则永远不会展开正在发送的数据的内容。

唯一 session

只要您的服务使用 JWT 进行身份验证,您就会向他们发回一个身份验证 token 。这就像随机数或 GUID 一样简单。此标识符将作为在此 session 期间在此 channel 上发送或接收数据的任何请求的一部分,它只会在此特定 channel 上被接受,并且仅当此唯一 session 打开时才被接受。

再进行一次安全检查:链接 reply attack

我为您提供了我每天使用的与中央银行安全地来回发送数据的技巧(因此,按照这些技巧,我认为您的应用程序应该非常安全)

更新

如何处理JWT

创建一个新的中间件Verify JWT token,因为 laravel 中的中间件是其核心供应商的外层,这意味着如果身份验证失败,它将在外层而不是核心中失败。

将路由分组到 Verify JWT token 中间件下!

创建一个 RedisRepository 这可以在 App\RedisRepository 下。这个类应该负责从redis中获取数据。

在中间件上解密用户 JWT 获取解密的有效负载(这可能是用户 UUID 或 ID)。

从 RedisRepository 中获取 user ID 如果肯定的身份验证通过,则与解密的有效负载进行比较,否则中止 403 unauthenticated!

关于node.js - 如何保护 Redis 和 Socket.IO 实时服务器,以便只有经过身份验证的用户才能收听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47895514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com