Express + Passport - req.session.passport在后续请求中未定义

时间:2017-01-10 23:10:28

标签: javascript node.js session express passport.js

我已经开始开发一个小项目,我在客户端使用React与Redux,后端使用Node,Express和Passport.js完成 我会尽力描述最好的情况。 在身份验证之后,当用户从服务器发送到客户端时,将设置字段req.session.passport以及req.user。但是当我做下一个请求时,无论是注销还是例如/ something / add这些字段都是未定义的。

在进行身份验证时,正在调用serializeUser,但是deserializeUser没有,我不认为它应该在这里,也许我错了。就我调试问题而言,req.login也被调用了。 在接下来的请求看来,护照似乎没有做任何事情,而且我没有想法和来自SO和谷歌的东西。我没有尝试自定义回调。

在将anwser发送到客户端之前的

req.session看起来像:

Session {
  cookie:
   { path: '/',
     _expires: 2017-01-11T02:31:49.235Z,
     originalMaxAge: 14400000,
     httpOnly: false,
     secure: false } }

服务器端的代码是:

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

    passport.deserializeUser(function(id, done) {
        global.Models.User.findById(id, function(err, user) {
            done(err, user);
        });
    });

    passport.use(new LocalStrategy(
        {
            usernameField: 'login',
            passwordField: 'password',
            passReqToCallback: true
        },
        function(req, login, password, done) {
            global.Models.User.logIn({login: login, password: password}, function(err, user){

                if(err){
                    done(err);
                }
                else{
                    done(null, user);
                }

            });
        }
    ));
    var app = express();
    var router = express.Router();
    router.use(cookieParser());
    router.use(bodyParser.urlencoded({extended: false}));
    router.use(bodyParser.json());
    router.use(session({
        cookie : {
            secure : false,
            maxAge : (4 * 60 * 60 * 1000),
            httpOnly: false
        },
        secret: this._config.session.secret,
        resave: false,
        saveUninitialized: true
    }));
    router.use(passport.initialize());
    router.use(passport.session());

    require('./Router')();
    app.use(router);

这里的会话对象是快速会话。代码下面是上面需要的Router.js

var User = require('../Models/User');
var News = require('../Models/News');

var passport = global.Application.getInstanceOf("passport");

function setRoutes(){
    router.use(function (req, res, next) {

        var log = global.Application.getInstanceOf("logger");

        var clientIP =  req.headers['x-forwarded-for'] || 
                        req.connection.remoteAddress || 
                        req.socket.remoteAddress ||
                        req.connection.socket.remoteAddress;

        log.log("info", req.method + " request from ip: " + clientIP);

        res.header('Access-Control-Allow-Origin', 'http://localhost:8080');
        res.header('Access-Control-Allow-Credentials', true);
        res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
        res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

        if('OPTIONS' == req.method){
            res.sendStatus(200);
        }
        else{
            next(); 
        }       

    });

    router.get('/ping', function(req, res){
        res.send('ping');
    });

    router.get('/login/:login', (req, res) => {
        Database.client.query(Database.queries.USER_LOGIN, {login: req.params.login}, {useArray: true}, 
        (err, rows) => {
            if(err){
                res.send({error: "ERROR_DATABASE"});
            }
            else{
                res.send(rows[0][0]);
            }
        });
    });

    router.post('/login', passport.authenticate('local', {session: true}), 
        function(req, res){
            console.log(req.session);
            req.session.save();
            res.send(req.user);
        }
    );

    router.post('/register', (req, res) => {
        User.create(req.body, (err, result) => {
            if(err){
                res.send({error: "ERROR_DATABASE"});
            }
            res.send(result);
        });
    });

    router.get('/logout', function(req, res){
        console.log(req.session);
        req.logout();
        res.sendStatus(200);
    });

    router.post('/cms/article', isAuthenticated, (req, res) => {
        res.send("BLA");
    });

    function isAuthenticated(req, res, next){
        console.log(req.user);
        console.log(req.session);
        console.log(req.session.passport);
        if(req.isAuthenticated()){
            next();
        }
        else{
            res.send("OK");
        }
    }
}

module.exports = setRoutes;

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。

说明: Cookie是通过快递发送给客户的,但它没有被保存。为此,需要将$ .post更改为$ .ajax,并将xhrFields选项设置为{withCredentials:true}。

除此之外,问题也可能是,cookieParser现在也可能需要知道cookie秘密。