Socket.io - 为私人消息传递实现用户套接字关联映射

2024-02-11

我正在尝试使用 socket.io 创建一个私人消息系统

为了将用户与其套接字相关联,大多数网站都建议如下:

var people = {};

client.on('connection', function(socket) {

    //join the server
    socket.on('add user', function(user_id) {
        //create user-socket map
        people[user_id] = socket.id;
    });

});

在我看来,上述代码的问题在于user_id是从客户端发送的,因此如果用户以某种方式修改它并发送另一个user_id将会发生冒充行为。

另外我也无法访问req.user._id under client.on('connection'...那么我应该如何得到user_id从服务器端?我使用的是node.js、passport 和express。


我会用jsonwebtoken and socketio-jwt用于解决此安全问题的模块。

Server:

var secret = 'shhhhhh';
app.get('/getJWT', function(req, res) {
    /* Do your authentication here using header and get the userId */
    var userId = 'someId';
    var jwt = require('jsonwebtoken');
    var token = jwt.sign({ 'userId': userId }, secret);
    res.json({
        token: token
    });
});

var socketioJwt = require('socketio-jwt');
io.use(socketioJwt.authorize({
    secret: secret,
    handshake: true
}));

io.sockets.on('connection', function (socket) {
    var userId = socket.decoded_token.userId;
    /* your logic */

Client:

var token = "token you got from the /getJWT"
var c = io.connect('http://localhost:3000/', { query: "token=" + token });

由于令牌是用秘密编码的,因此客户端无法更改和发送它。

Refer this https://auth0.com/blog/2014/01/15/auth-with-socket-io/文章以了解为什么这更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket.io - 为私人消息传递实现用户套接字关联映射 的相关文章

随机推荐