【发布时间】:2020-10-12 19:28:48
【问题描述】:
我想知道在 socket.io 中对用户进行身份验证的最佳方式是什么?我构建了一个聊天应用程序,将所有用户存储在这样的数组中:
let sockets = [];
sockets[userdbId] = socket.id
有一些问题。
io.on("connection", async socket => {
socket.on("online", (userId, friends) => {
sockets[userId] = socket.id;
friends.forEach((id, index) => {
if(sockets[id]){
socket.to(sockets[id]).emit("friendOnline", data)}
})
})
socket.on("Message", (message, userData, toUserId, callback) => {
socket.to(sockets[toUserId]).emit("message", {userId: userData._id,
userData: {userName: userData.userName,avatarUrl: userData.avatarUrl}, UserMessage: message })
callback();
})
})
-首先,当用户打开一个新选项卡时,react app 会与套接字建立新连接并生成不同的套接字 id,因此预览选项卡不起作用。
-第二,我的应用分为两部分。大厅和朋友聊天,我不确定但可能我以错误的方式实现它,因为朋友部分通过 io.connect(window.location.host) 连接到套接字并监听消息,但大厅部分连接 io(window.host) location.host/lobby/lobbyId) 所以这种连接再次更改套接字 id。
现在我正在寻找有关如何制作安全且唯一的套接字 ID 的解决方案。你知道如何解决吗?
【问题讨论】:
-
我在考虑使用 jwt 令牌作为身份验证,您对此有何看法?
-
为什么是数组?如果您的
userdbId值变得非常大,这将无缘无故地创建一个巨大的数组。使用对象作为哈希:let sockets = { }; -
只是临时解决办法,以后会用redis
-
这是一个临时修复。如果您的 ID 值类似于 2930123 ,则绝对没有理由创建一个 huge 数组。
{}的工作原理完全相同,但仅在必要时创建条目。除所需之外的零代码更改。
标签: node.js reactjs sockets socket.io