我试图在堆栈溢出时找到有关此问题的答案,但找不到任何有用的方法。因此,在所有示例中,我发现它们使用护照中间件。 我正在使用Express-Session中间件对会话进行验证。
据我了解,会话中间件使用提供某种HMAC的秘密。因此,它不能被伪造或修改。所以如果我做这样简单的事情
app.use((req, res, next) => {
if(!req.session) return next();
*if(req.session.userId){
getDb().collection('users').findOne({_id: req.session.userId})
.then(user=>{
if(!user) return next();
req.userId = req.session.userId;
next();
})
}*else{
next();
}
});
/*
Then this 'if(!user) next()' is not required because my backend would
always put right id of a user in session, and it can't be modified on client.
I've put it here because it could happen that user gets deleted while session exists.
*/
所以现在回到socket.io。我发现express和socket之间没有连接,所以我无法轻易获得req.session。有包叫 我安装了“ express-socket.io-session”,以便能够访问每个套接字上的会话。现在,我在路由/ chat上每个已连接套接字上的登录/身份验证(仅对经过身份验证的用户可用)看起来像在每个快速路由上一样,但它位于io.listener中。就像这样:
//Session access: socket.handshake.session
module.exports = async function(socket){ //This is mounted on io.on('connection')
if(socket.handshake.session){
//Login user with the session
const user = await getDb().collection('users').findOne({_id:socket.handshake.session.userId});
if(!user){
/*If somehow there is no user found in db from session then
disconnect socket and send it to client*/
return socket.disconnect();
}
//If user with same username is connected. Disconnect other user
if(user.username in connectedUsers){
const socketId = connectedUsers[user.username].socketId;
io.sockets.connected[socketId].disconnect();
delete connectedUsers[user.username];
}
connectedUsers[user.username] = {...user, socketId: socket.id}; //I DONT EXPOSE FULL USER OBJECT TO CLIENT! (only username and similar info)
//Inform all users
io.sockets.emit(UPDATE_USERS, updateUsers(connectedUsers));
/*
Again updateUsers function doesn't expose full user object just count of
users and array of usernames...
*/
//MORE CODE LIKE THIS...
如果您不想阅读完整的代码,这就是我没有做的事情
我的会话有一个秘密(不能伪造或修改?) 表达会话。
我从套接字上不会发出任何危险的信息,例如用户ID或哈希密码,用户名,profile_pic等。
只有当另一个用户通过访问该用户的计算机从另一个用户窃取了session.sid时,我的应用程序才可能被利用。哪一个 可以理解。
那么我的方法中是否存在泄漏?我会遇到什么问题?