我将尝试对 socket.io 上的连接进行身份验证。
目前,用户首先通过REST API进行身份验证,然后,我向用户发送一个JsonWebToken
,其中包含经过身份验证的用户的用户名。打开客户端和服务器之间的连接后,我的计划是从连接的套接字列表中临时删除该套接字,以防止在执行身份验证时在服务器之间接收和发送数据。
在这个身份验证中,我验证令牌,如果令牌有效,我将套接字的id重新添加到已连接套接字的列表中。唯一的问题是第一部分不行。我似乎不能从列表中删除插座。
为了测试这一点,我做了以下操作。
io.on('connection', function(socket){
//temp delete socket
delete io.sockets.connected[socket.id];
console.log(io.sockets.connected);
socket.emit("test");
});
如您所见,我删除了套接字并发出一个测试事件来查看套接字是否仍然打开。客户端收到了不应该收到的消息。
有人知道为什么会发生这种情况吗?
socket.io还将套接字保存在命名空间中(如果未指定,则为默认值),并且需要将其删除才能停止接收消息。
请参阅这篇文章,逐步解释您要做的事情,以及这个抽象整个过程的模块。
尝试从套接字对象中使用断开连接方法,如下所示:
io.on('connection', function(socket){
//temp delete socket
socket.disconnect();
console.log(io.sockets.connected);
socket.emit("test");
});
更新:
例如,如果您的 HTTP 服务器向客户端提供令牌:
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});
});
然后,您可以重用该令牌来验证您的web套接字连接。
来自客户端的令牌发送代码(html文件)将是:
socket = io.connect('http://localhost:4000', {
query: 'token=' + validToken,
forceNew: true
});
并且服务器中的socketion授权码(socketion)将是:
// 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');
});
请注意,快车上用于生成令牌的秘密,相同的令牌也被用于Socketio中间件的验证令牌上。
我创建了一个示例,您可以在其中看到这种验证的工作原理,源代码在这里:https://gist.github.com/wilsonbalderrama/a2fa66b4d2b6eca05a5d
将它们复制到一个文件夹中,运行server.js with node,然后从浏览器的以下URL访问html文件:http://localhost:4000
但首先安装模块:socket.io,express,socketio-jwt,jsonwebtoken
问题内容: 我正在尝试在Node.js中使用Socket.IO,并试图允许服务器为每个Socket.IO客户端赋予一个身份。由于套接字代码不在http服务器代码的范围内,因此无法轻松访问已发送的请求信息,因此我假设在连接期间需要将其发送出去。什么是最好的方法 1)将有关谁通过Socket.IO连接到服务器的信息 2)验证他们说的是谁(如果正在使事情变得更容易,我目前正在使用Express) 问题答
我想知道socket.io身份验证的最佳实践是什么。 Alice发出事件'message',参数包括Bobs、唯一标识符等。Bob在监听Socket.on('message')事件时接收消息。
问题内容: 我可以不用密码就可以将Node应用程序连接到Redis,但是添加密码后,我无所事事。 这是我的代码,摘自一个示例: 在运行应用程序时,我得到以下堆栈跟踪: 生成该行的行是最后一个-如果我注释掉尝试设置RedisStore的尝试,则不会出现任何错误。 我确定密码正确(我可以在redis- cli中进行验证,如果我将密码更改为错误,则可以验证auth回调不会触发)。如果我删除密码并注释掉两
问题内容: 如何在Elasticsearch中定义安全性访问?我有elasticsearch-head插件,但是您的访问不需要任何安全性。 问题答案: 不再积极支持此答案中提到的插件。 elasticsearch中没有内置的访问控制。因此,您需要设置一个反向代理(这是一个博客文章,介绍如何设置nginx),使用第三方的Elasticsearch插件之一,例如https://github.com/A
问题内容: 我正在研究一款小型多人游戏。我想介绍身份验证。我正在使用Node.js和Socket.io。 当用户到达该主页时-无论他们是否登录,我都希望他们加入游戏-但他们将无法在其中进行任何操作(仅观看)。 然后我该如何在已经打开的套接字上对用户进行身份验证? 如果他们离开站点并回来,我还能保持身份验证吗?您可以通过网络套接字传递Cookie吗? 编辑 进一步我的问题。我可能想到的一种方法是提供
本文向大家介绍asp.net mvc中Forms身份验证身份验证流程,包括了asp.net mvc中Forms身份验证身份验证流程的使用技巧和注意事项,需要的朋友参考一下 验证流程 一、用户登录 1、验证表单:ModelState.IsValid 2、验证用户名和密码:通过查询数据库验证 3、如果用户名和密码正确,则在客户端保存Cookie以保存用户登录状态:SetAuthCookie 1