我正在尝试在登录时设置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。我不想使用任何模块来处理授权,例如护照等。
答案 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。