【问题标题】:passport.js session lost after redirect重定向后passport.js会话丢失
【发布时间】:2018-02-20 01:08:39
【问题描述】:

我正在尝试将 passport 集成到我的 node.js 应用程序中。

app.js文件

const app = express();
app.set('view engine', 'pug');
app.use('/libs', express.static('node_modules'));

require('../config/auth.config')(app, data, passport);
app.use((req, res, next) => {
    res.locals.user = req.user;
    next();
});

app.get('/', (req, res) => {
        // those objects are populated correctly after redirect from auth middleware
        console.log(req.session)
        console.log(req.user)
        return res.render('home');
    });
app.get('/login', console.log(req.user);
        // req.user is undefined here
        if (req.user) {
            return res.redirect('/');
        }

        return res.render('login'););
app.post('/login', passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/login',
}));

auth.config.js

const express = require('express');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const LocalStrategy = require('passport-local');
const MongoStore = require('connect-mongo')(session);
const config = require('./config');

const configAuth = (app, {
    users
}, passport, db) => {
    app.use(cookieParser('Purple Unicorn'));
    app.use(bodyParser.urlencoded({
        extended: true,
    }));
    app.use(bodyParser.json());
    app.use(session({
        store: new MongoStore({
            url: config.connectionString
        }),
        secret: 'Purple Unicorn',
        resave: true,
        saveUninitialized: true,
    }));
    app.use(passport.initialize());
    app.use(passport.session());

    passport.use(new LocalStrategy((username, password, done) => {
        return users.login(username, password)
            .then((user) => {
                if (user) {
                    return done(null, user);
                }
                return done(null, false);
            });
    }));

    passport.serializeUser((user, done) => {
        done(null, user._id);
    });

    passport.deserializeUser((id, done) => {
        users.getUserById(id)
            .then((user) => {
                console.log(user);
                if (user) {
                    done(null, user);
                }

                done(null, false);
            });
    });

    app.use((req, res, next) => {
        res.locals = {
            user: req.user,
        };
        next();
    });
};

module.exports = configAuth;

数据对象工作正常。

/login 上发布带有正确数据的请求后,我被重定向到/,其中console.log(req.user) 打印了正确的用户。它也被添加到req.session 对象中。

在我点击指向/login 的链接后,它应该在检查req.user 后重定向我,但返回undefined。 mongo 中的会话存储正确。

护照似乎没有正确保存会话。

【问题讨论】:

  • 其中一个问题是您的 deserializeUser 方法,您总是运行两次 done 回调。在if 声明中,你应该使用return done(null, user); 退出函数;
  • 谢谢!您可以将此作为答案发布,以便我选择它。

标签: node.js express passport.js passport-local


【解决方案1】:

问题出在您的 deserializeUser 方法中,您总是运行两次 done 回调。在 if 语句中,您应该使用 return done(null, user); 退出函数;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 2013-06-19
    相关资源
    最近更新 更多