我正在尝试使用 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(使用前将#替换为@)