会话cookie未在下一个请求中设置 - Express.js

时间:2017-02-26 22:26:06

标签: javascript node.js session express cookies

我正在尝试在登录时设置cookie,但cookie似乎不会跟随下一个请求。我究竟做错了什么? (对不起,如果不高兴的问题,表达新鲜事。)

app.js

let express = require("express");
let session = require("express-session");
let bodyParser = require("body-parser");

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: false,
    cookie: { secure: true }
}));

路由器

router.route("/login")
    .get(function(request, response) {

        response.render("../views/partials/login");
    })

    .post(function(request, response) {

        let username = request.body.username;
        let password = request.body.password;

        User.findOne({user: username}, function(err, user) {
            if (err) {
                // Some error handling
            }

            // test password if matching
            if (user !== null) {
                user.comparePassword(password, function(err, match) {
                    if (err || !match) {
                        console.log("The user could not be found")
                    }

                    request.session.Auth = { username: username, password: password };
                    response.redirect("/home");
                    response.end();
                });
            } else {
                // some error handling
            }
        });

    });

然后当我在“/ home”上执行下一个请求时,会话cookie没有关于用户的值( req.session.Auth返回undefined

router.route("/home")
    .get(restrict, function(req,res) {

console.log(req.session.Auth) // -> undefined
        res.render("../views/home")
    });

也许我做错了,但我无法理解为什么request.session没有保存Auth值。有人可以帮忙吗?

P.S。我不想使用任何模块来处理授权,例如护照等。

3 个答案:

答案 0 :(得分:0)

你正在做的事情不起作用。

我真的建议您使用passport.js进行身份验证。这很简单,并且带走了你现在正在做的很多工作。在此post请求中访问请求对象不会做任何事情。

答案 1 :(得分:0)

请尝试这种方式。

首先在快递

中启用cookie会话
app.use(express.cookieParser('S3CRE7'));
app.use(express.cookieSession({
    key: 'app.key',
    secret: 'app.secret'
}));
app.use(app.router);

启用cookie会话后,您可以获取/设置任何属性request.session。

我认为你的其余逻辑很好。

答案 2 :(得分:0)

您是否在使用HTTPS测试应用?如果没有,那么您应该初始化没有cookie: { secure: true }属性的快速会话,如

app.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: false
}));

安全cookie是一种只在使用HTTPS时才会发送的cookie。