javascript - 使用 Passportjs 刷新页面后保持身份验证

标签 javascript session express mongoose passport.js

我正在使用 expressmongoosepassportjs 构建 SPA。

我为我的用户创建了一个简单的模式:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');

var User = new Schema({
    username: String,
    password: String,
    first_name: String
}, { collection: 'users' });

User.plugin(passportLocalMongoose);

mongoose.model('User', User);

使用 mongoose 给我的 User 对象配置 Passport :

passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());         
passport.deserializeUser(User.deserializeUser());

并将我的应用配置为在导航到此路线时对用户进行身份验证:

app.post('/login', passport.authenticate('local'), function(req, res, next) {
    if (req.isAuthenticated()) {
        return res.json({ state: 'success', user: { first_name: req.user.first_name } });    
    }
    return res.json({ state: 'failure', message: 'cannot authenticate' });
});

现在我可以成功验证用户身份了。浏览器会保存一个 session ID cookie。

我的问题是,每次用户刷新页面时,passport 都不会使用 session ID 反序列化用户,这导致用户未通过身份验证。

在访问站点根目录中的 req.user 对象时,我得到了 undefined 这让我意识到 Passport 没有正确反序列化用户:

app.use('/', function (req, res, next) {
    console.log(req.user); // prints undefined.        

    next();
});

刷新页面后恢复用户的正确方法是什么?

最佳答案

解决方案是将 session 存储在DB 中。我用了connect-mongo .

应用程序.js:

var mongoose = require('mongoose');
var expressSession = require('express-session');
var MongoStore = require('connect-mongo')(expressSession);

mongoose.connect(db_url, function (err) {
    if (err) {
        console.log(err);
    }
});

app.use(expressSession({
    secret: process.env.SESSION_SECRET || 'keyboard cat',
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection })
}));

在此之后,即使在刷新页面之后,req.isAuthenticated() 也会对每个请求返回 true。 (感谢 app.use(passport.session()) 出现在任何路由处理程序之前)

app.use('/', function (req, res, next) {
    if (req.isAuthenticated()) {
        // returns true if a user already logged in.
    }
    next();
});

关于javascript - 使用 Passportjs 刷新页面后保持身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721225/

相关文章:

php - Laravel 4.2 session 表未清理

php - 无法修改标题信息 session Cookie创建吗?

node.js - 跟踪两个不同服务器之间的用户

javascript - 如何使用 Express 设置日志记录级别?

javascript - 在 JavaScript 中,为什么零除以零返回 NaN,而任何其他除以零返回 Infinity?

javascript - 重定向后快速 session 不持久

mysql - node.js/express/mysql/serialport/socket.io

javascript - 模块没有导出成员, 'Request'

php - 在回调函数中处理数据,jquery 的 .get 不起作用

javascript - 如何在日期选择器中添加自定义模板。?