gpt4 book ai didi

node.js - Socket.io 中的身份验证

转载 作者:搜寻专家 更新时间:2023-10-31 22:23:18 63 4
gpt4 key购买 nike

我将尝试在 socket.io 上验证连接。

目前,用户首先通过 REST API 进行身份验证,然后,我向用户发送一个 JsonWebToken,其中包含经过身份验证的用户的用户名。在我打开客户端和服务器之间的连接后,我的计划是暂时从已连接的套接字列表中删除该套接字,以防止在进行身份验证时在服务器之间接收和发送数据。

在此身份验证中,我验证 token ,如果 token 有效,我将套接字的 ID 重新添加到已连接套接字列表中。唯一的问题是第一部分不起作用。我似乎无法从列表中删除套接字。

为了对此进行测试,我执行了以下操作。

io.on('connection', function(socket){
//temp delete socket
delete io.sockets.connected[socket.id];
console.log(io.sockets.connected);
socket.emit("test");
});

如您所见,我删除了套接字并发出测试事件以查看套接字是否仍处于打开状态。客户端在不应收到的情况下收到了消息。

有人知道为什么会这样吗?

最佳答案

尝试使用 socket 对象的 disconnect 方法,像这样:

io.on('connection', function(socket){
//temp delete socket
socket.disconnect();

console.log(io.sockets.connected);
socket.emit("test");
});

更新:

例如,如果您的 HTTP 服务器给客户端一个 token :

app.post('/api/users', function (req, res) {
var user = {
username: req.body.username
};

var token = jwt.sign(user, secret, {expiresInMinutes: 30});

res.json({token: token});
});

然后您可以重用该 token 来验证您的 websocket 连接。

来自客户端(html 文件)的 token 发送代码将是:

socket = io.connect('http://localhost:4000', {
query: 'token=' + validToken,
forceNew: true
});

服务器(socketio)中的socketio授权码为:

// here is being used a socketio middleware to validate
// the token that has been sent
// and if the token is valid, then the io.on(connection, ..) statement below is executed
// thus the socket is connected to the websocket server.
io.use(require('socketio-jwt').authorize({
secret: secret,
handshake: true
}));



// but if the token is not valid, an error is triggered to the client
// the socket won't be connected to the websocket server.
io.on('connection', function (socket) {
console.log('socket connected');
});

请注意,在 express 上用于生成 token 的 secret ,在 socketio 中间件的验证 token 上也使用了相同的 token 。

我创建了一个示例,您可以在其中看到这种验证的工作原理,源代码在这里:https://gist.github.com/wilsonbalderrama/a2fa66b4d2b6eca05a5d

将它们复制到一个文件夹中并使用 node 运行 server.js,然后通过浏览器访问此 URL 中的 html 文件:http://localhost:4000

但首先安装模块:socket.io、express、socketio-jwt、jsonwebtoken

关于node.js - Socket.io 中的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814330/

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