我正在尝试在Node.js中使用Socket.IO,并尝试允许服务器为每个Socket.IO客户端提供一个标识。因为套接字代码不在http服务器代码的范围内,所以它不容易访问发送的请求信息,所以我假设它需要在连接期间发送。最好的方法是什么
1)向服务器获取谁在通过Socket.IO连接的信息
2)验证他们所说的身份(我目前正在使用Express,如果这能让事情变得更容易的话)
发布于 2011-01-21 10:20:25
使用connect-redis并将redis作为所有经过身份验证的用户的会话存储。确保在身份验证时将密钥(通常为req.sessionID)发送到客户端。让客户端将此密钥存储在cookie中。
在套接字连接时(或以后的任何时候),从cookie中获取该密钥,并将其发送回服务器。使用此密钥获取redis中的会话信息。(获取密钥)
例如:
服务器端(使用redis作为会话存储):
req.session.regenerate...
res.send({rediskey: req.sessionID});
客户端:
//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();
socket.on('connect', function() {
var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
socket.send({rediskey: rediskey});
});
服务器端:
//in io.on('connection')
io.on('connection', function(client) {
client.on('message', function(message) {
if(message.rediskey) {
//fetch session info from redis
redisclient.get(message.rediskey, function(e, c) {
client.user_logged_in = c.username;
});
}
});
});
发布于 2014-01-16 23:01:18
我知道这有点老了,但是对于未来的读者来说,除了解析cookie和从存储中检索会话的方法之外(例如:passport.socketio ),您也可以考虑基于令牌的方法。
在本例中,我使用了非常标准的JSON Web令牌。您必须向客户端页提供令牌,在本例中,假设有一个身份验证端点返回JWT:
var jwt = require('jsonwebtoken');
// other requires
app.post('/login', function (req, res) {
// TODO: validate the actual user user
var profile = {
first_name: 'John',
last_name: 'Doe',
email: 'john@doe.com',
id: 123
};
// we are sending the profile in the token
var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 });
res.json({token: token});
});
现在,您的socket.io服务器可以进行如下配置:
var socketioJwt = require('socketio-jwt');
var sio = socketIo.listen(server);
sio.set('authorization', socketioJwt.authorize({
secret: jwtSecret,
handshake: true
}));
sio.sockets
.on('connection', function (socket) {
console.log(socket.handshake.decoded_token.email, 'has joined');
//socket.on('event');
});
socket.io-jwt中间件需要查询字符串中的令牌,因此在客户端,您只需在连接时附加它:
var socket = io.connect('', {
query: 'token=' + token
});
我写了一个关于这个方法和cookies here的更详细的解释。
发布于 2012-05-05 20:29:46
这应该就行了
//server side
io.sockets.on('connection', function (con) {
console.log(con.id)
})
//client side
var io = io.connect('http://...')
console.log(io.sessionid)
https://stackoverflow.com/questions/4753957
复制相似问题