Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Node.js Express Passport Cookie过期大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的应用程序中使用护照进行身份验证,我也使用Express.总结我的问题:我的登录功能初次运行正常,但任何用户的会话超时后,没有用户能够登录.

我正在使用标准的本地策略进行身份验证.

我将根据我的设置尽可能地包括一个例子:

//-------------
//Set up authentication with Passport
//-------------
var userModel = require('./models/user')(db);
passport.use(new LocalStrategy(
    function(username,password,donE) {
        var errormessage = 'Incorrect username/password combination.';
        userModel.GetUserByUsername(username,function(err,user) {
            if (err) { return done(err); }
            if (!user) {
              return done(null,false,{ message: errormessage });
            }

            user.validatepassword(password,function(ispasswordCorrect) {
                if (!ispasswordCorrect)
                {
                    return done(null,{ message: errormessage });
                }

                //update with login date
                userModel.updateUserWithLogin(username,user.currentLoginTime,function(err){
                    //if we have an error here,we should probably just log it
                    if(err)
                    {
                        console.log(err);
                    }
                });

                return done(null,user);
            });
        });
    }
));

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

passport.deserializeUser(function(user,donE) {
    userModel.GetUserByUsername(user._id,user) {
            done(err,user);
        });
});

//-------------
//Set up express and configure
//-------------
var sessionStore = new SkinStore(db);
var app = express();

app.configure(function(){
    app.set('port',process.env.PORT || 3000);
    app.set('views',__dirname + '/views');
    app.ENGIne('html',consolidate.swig);
    app.set('view ENGIne','html');
    swig.init({
        root: '.',allowErrors: true,// allows errors to be thrown and caught by express instead of suppressed
        autoescape: falsE});

    app.use(express.logger('dev'));

    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser("[mysecrethere]"));
    app.use(express.session({   store: sessionStore,cookie: { expires : new Date(Date.Now() + 3600000) } //1 Hour
                            }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(flash());
    app.use(expressvalidator);

    app.use(express.static(path.join(__dirname,'public')));

    //Dynamic Helpers
    app.use(require('./Helpers/DynamicHelpers'));

    app.use(app.router);
});

app.get('/login',routes.login);
app.post('/login',passport.authenticate('local',{failureRedirect: '/login',badrequestmessage: "Please enter username and password",failureFlash: true }),function(req,res) {
                                                    var targetUrl = req.session.pageAfterLogin;
                                                    delete req.session.pageAfterLogin;
                                                    res.redirect(targetUrl || '/account');
                                                });

app.get('/account',IsAuthenticated,routes.account.show);

和IsAuthenticated帮助函数

function IsAuthenticated(req,res,next){
    if(req.isAuthenticated())
    {
        next();
    }
    else
    {
        //save the requested page and then redirected
        req.session.pageAfterLogin = req.url;
        req.flash("error","You must be logged in first!");
        res.redirect('/login');
    }
}

我可以通过调试找到,认证成功后(cookie过期后),我按这个逻辑(从上面):

function(req,res) {
    var targetUrl = req.session.pageAfterLogin;
    delete req.session.pageAfterLogin;
    res.redirect(targetUrl || '/account');
}

在哪里可以看到“req”会话正确设置,护照信息存储正确.然后,发生重定向,新请求没有存储会话信息,并且具有全新的会话ID.我怀疑客户端上没有设置cookie,这似乎是这样,这应该解释缺乏一致的会话.

但是,我不知道为什么没有设置新的cookie.应用程式如何配置出现问题,表明为什么会发生这种情况?

我应该补充说,重新启动Node.js实例来修复这个问题,这不仅仅是生产中容忍的东西.

谢谢.

更新:我运行了fiddler来看看http / S的流量发生了什么,我可以看到,当它最初工作时,我在浏览器中设置了一个cookie(我尝试了几个),然后将其传回给服务器后续请求.

当它不起作用时,浏览器不会将cookie传递到服务器,因此Node发送一个Set-Cookie头,每次都提供一个新的cookie.到目前为止,我没有运气确定这个原因.

解决方法

我想出来,然我不喜欢这个答案.

TL;博士; – 使用maxAge而不是expires.

该问题植根于每个Cookie设置的有效期(由Express自动设置).我注意到,所设置的每个cookie都有相同的到期日期,最终终止于过去,因此立即过期.

原因在于:

cookie: { expires : new Date(Date.Now() + 3600000) }

服务器启动后,新的日期只会被创建一次.这是导致到期日期相同的每一次.根据原始帖子中的代码,我不知道为什么它不起作用,但是我在网上找到的每个例子都使用完全相同的代码.我通过定义一个创建此Date的函数来验证这一点,并检查它仅在服务器启动时被调用.

为了解决这个问题,我定义了maxAge而不是“expires”. maxAge需要几毫秒而不是日期,并且正好在所有的cookie上设置到期日.

我很乐意听到有人可以解释为什么这是发生在第一位,因为其他人似乎成功使用它.有什么想法吗?

请看我下面的工作代码

app.configure(function(){
    app.set('port',cookie: { maxAge : 3600000 } //1 Hour
                            }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(flash());
    app.use(expressvalidator);

    app.use(express.static(path.join(__dirname,'public')));

    //Dynamic Helpers
    app.use(require('./Helpers/DynamicHelpers'));

    app.use(app.router);
});

大佬总结

以上是大佬教程为你收集整理的Node.js Express Passport Cookie过期全部内容,希望文章能够帮你解决Node.js Express Passport Cookie过期所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。