gpt4 book ai didi

node.js - 在未注册浏览器的情况下更新 cookie session

转载 作者:搜寻专家 更新时间:2023-10-31 22:42:34 26 4
gpt4 key购买 nike

我已经设置了一个工作登录测试如下:

var express = require('express');
var fs = require('fs');
var http = require('http');
var path = require('path');
var routes = require('./routes/index.coffee');
var passport = require('passport');

var LocalStrategy = require('passport-local').Strategy;
var User = require('./userdb.coffee');
var app = express();
var RedisStore = require('connect-redis')(express);

passport.use(new LocalStrategy(function(username, password, done) {
return User.findOne({
username: username
}, function(err, user) {
if (err) {
return done(null, false, message: error);
}
if (!user) {
return done(null, false, {
message: 'Unknown user'
});
}
if (!user.validPassword(password)) {
return done(null, false, {
message: 'Invalid password'
});
} else {
return done(null, user);
}
});
}));

passport.serializeUser(function(user, done) {
return done(null, user);
});

passport.deserializeUser(function(user, done) {
return done(null, user);
});

app.configure(function() {
app.set('port', process.env.PORT || 5003);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.enable('trust proxy');
app.use(express["static"](path.join(__dirname, 'public')));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('SOMESECRET'));
app.use(express.session({
cookie: {
maxAge: 10 * 60 * 1000
},
key: 'express.sid',
secret: 'SOMESECRET',
store: new RedisStore({
port: 6379,
host: 'localhost'
})
}));
app.use(passport.initialize());
app.use(passport.session());
return app.use(app.router);
});

var check_auth = function(req, res, next) {
if (req.isAuthenticated()) {
console.log(req.session.cookie.expires);
return next();
}
return res.redirect('/login');
};

app.get('/', check_auth, routes.index);
app.get('/login', routes.login);
app.get('/logout', routes.logout);
app.post('/authenticate', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
}));

app.listen(app.get('port'), '0.0.0.0');

路由和用户逻辑被省略,因为我认为它们与我的问题无关,但如果需要我会很乐意分享它们(它们非常小,这只是为了获得一个小的概念证明并运行)。

登录有效,读取 session 有效,基于 session 值渲染模板有效。我的问题是 maxAge/expires。我不确定问题出在哪里,但我会尝试描述它:

当我登录时, session 使用 passport.js 保存,正确存储在我的 RedisStore 中,指向 session 的 cookie 返回给浏览器。在后续请求中,cookie 被成功找到并指向来 self 的 SessionStore 的正确 session 。 req.session.cookie 显示更新的 expires 并且在我的 redis 服务器中,TTL 重置为 10 分钟 (600)。

我的问题是 cookie 在浏览器(Chrome、windows 和 Mac)中保持相同的到期时间。

所以我的问题是:我怎样才能进一步调试它?由于 req.session 已更新(通过 expresspassportconnect-redis 内部/自动更新),我想知道问题出在哪里,以及我应该如何解决这个问题:Cookie 保持在最初的 maxAges/expires

非常感谢任何提示、指示或想法。

最佳答案

Express-session 支持滚动 cookie 过期日期。不幸的是,它最近才被记录下来。

为您的 session 使用“滚动”选项。这“强制对每个响应设置一个 cookie”并“重置过期日期”。您想将滚动设置为真。

还要注意“重新保存”选项。 “即使未修改也强制保存 session ...”您可能还想将该选项设置为 true。请注意,即使此选项的默认值为 true,您也应该明确设置该值。依赖于此选项的默认值,而不是显式设置,现已弃用。

尝试这样的事情:

app.use( session( { secret: 'keyboard cat',
cookie: { maxAge: 60000 },
rolling: true,
resave: true,
saveUninitialized: false
}
)
);

这是文档。查看“选项”和“options.resave”:https://github.com/expressjs/session .

关于node.js - 在未注册浏览器的情况下更新 cookie session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13090177/

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