node.js - Passport.js session 在重定向后丢失

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

我正在尝试集成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 中的 session 存储正确。

Passport 似乎没有正确保存 session 。

最佳答案

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

关于node.js - Passport.js session 在重定向后丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45152361/

相关文章:

node.js - 为什么我的服务器上列出了多个 PM2 进程?

javascript - 如何在nodejs中获取项目的单独id

mysql - Express.JS 应用程序与 mysql 服务器冲突

javascript - API 调用时获取无效 JSON

node.js - 如何让failureFlash在Passport.js本地策略中显示Flash消息?

javascript - 在 sails.js 下使用 SSL 时 Passport.js 无法初始化

javascript - Node.js:使用 Math 方法而不引用模块

node.js - 如何在nodejs中缓存hbs渲染的模板

node.js - 在 Node.js 上使用 Passport.js 和 React.js 前端进行身份验证

node.js - Node JS : Where is my POST data?