gpt4 book ai didi

javascript - express-session 不会设置 cookie connect.sid

转载 作者:行者123 更新时间:2023-11-30 15:32:32 41 4
gpt4 key购买 nike

编辑 5

我在 LAMP 环境中运行后端和前端,可通过 192.168.80.213/backend 地址访问。我尝试使用 nodejs、socket.io 和 express 框架制作一个推送通知服务器来链接后端和前端。

我的 nodejs 服务器正在监听端口 3000,而我的后端和前端都在使用 apache 监听端口 80。

这是我的 Node 客户端:

<script type="text/javascript" src="socket.io-1.4.5.js"></script>
<script type="text/javascript">
var socket = io('http://192.168.80.213:3000/');
</script>

这是我的 Node 服务器:

const   express          = require('express')
, app = express()
, http = require('http').Server(app)
, socketIo = require('socket.io')(http)
, cookieParser = require('cookie-parser')
, cookie = require('cookie')
, connect = require('connect')
, expressSession = require('express-session')
, port = 3000
, helmet = require('helmet')
, name = 'connect.sid'
, sessionStore = new expressSession.MemoryStore({ reapInterval: 60000 * 10 })
, sessionSecret = 'VH6cJa7yZSmkRbmjZW#J3%CDn%dt'
, environment = process.env.NODE_ENV || 'development'
;

/** Configuration **/
app.enable('trust proxy');
app.disable('x-powered-by');
app.use(helmet());
app.use(cookieParser());
app.use(expressSession({
'name' : name,
'secret': sessionSecret,
'store' : sessionStore,
'resave': true,
'saveUninitialized': true
}));

app.get('/', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello from node');
});

socketIo.use(function(socket, callback) {
// Read cookies from handshake headers
var cookies = cookie.parse(socket.handshake.headers.cookie);
// We're now able to retrieve session ID
var sessionID;
if (cookies[name]) {
console.log( "cookies['" + name + "'] = " + cookies[name] );
sessionID = cookieParser.signedCookie( cookies[name], sessionSecret );
console.log( "sessionID = " + sessionID );
}else{
console.log( "cookies['" + name + "'] = undefined" );
}

if (!sessionID) {
console.log('ERROR NO SESSION CONNECTION REFUSED !!');
callback('No session', false);
} else {
// Store session ID in handshake data, we'll use it later to associate
// session with open sockets
socket.handshake.sessionID = sessionID;
callback(null, true);
}

});


socketIo.on('connection', function (socket) { // New client
console.log( 'new connection..' );
console.log('user ' + socket.handshake.sessionID + ' authenticated and is now connected.');

});

/** Start server */
http.listen(port);
console.log( "listening on :" + port );

转到 192.168.80.213:3000 并查看 'Hello from node' 和 cookie['connect.sid'] 根据下面的屏幕截图设置

connect.sid cookie correctly set

控制台输出:

enter image description here

现在清除缓存,我将转到我的后端应用程序,我的 nodeClient 192.168.80.213/backend 就在那里。

connect.sid cookie 不存在

enter image description here

控制台输出:

enter image description here

为什么 express-session 没有设置 cookie.sid ?我该如何解决?我是 node 和 express 的新手,我花了很多时间谷歌搜索都没有成功,希望一些 Node 大师可以帮助我!!

问候

最佳答案

我不知道你使用的是哪个版本的 socket.io 但在 1.0 版本之后 (> 1.0):

  • 要注册中间件,您应该使用 socketIo.use(参见 documentation)
  • 第一个参数是传入套接字,它可以通过socket.request
  • 访问请求
  • express session 默认使用 connect.sid 名称保存 cookie 如果你想使用 io 名称你应该明确地设置它(参见 name option )
  • 当你想解析一个签名的 cookie 时,你应该提供 sessionSecret 而不是 sessionStore
  • 最后我认为握手支持已被弃用,您应该将任何您想要的东西直接附加到socket(参见 authentication-differences)。

考虑到上述情况,您可以使用像下面这样的中间件来Authenticate您的套接字:

// every incoming socket should pass this middleware
socketIo.use(function(socket, next) {
var cookies = cookie.parse(socket.request.headers.cookie);
var sessionID = cookieParser.signedCookie(cookies['connect.sid'], sessionSecret);
sessionStore.get(sessionID, function(err, session) {
if ( session && session.isAuthenticated ) {
socket.userId = session.user.id;
return next();
} else {
return next(new Error('Not Authenticated'));
}
});
});
// when connected ...
socketIo.on('connection', function(socket) {
console.log('user ' + socket.userId + ' authenticated and is now connected.')
});

我认为您在用户登录时在 session 上设置了 isAuthenticated bool 值和 user

另外请记住,内置于 sessionStore 中的 MemoryStore 不适用于生产环境:

The default server-side session storage, MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.

因此您必须考虑使用另一个 session 存储,例如:

关于javascript - express-session 不会设置 cookie connect.sid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022066/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com