我有一个简单的MEAN应用,我想实现一个简单的“自制”用户身份验证。我的想法是在用户登录时将userId保存在会话中,并检查每个页面请求(例如,在获取所有用户列表时)中会话中是否存在userId。
后端-server.js:
const express = require("express");
const session = require("express-session");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
var MemoryStore = session.MemoryStore;
app.use(
session({
name: "app.sid",
secret: "my_s3cr3t",
resave: true,
store: new MemoryStore(),
saveUninitialized: true
})
);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
const dbConfig = require("./config/database.config.js");
const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
mongoose
.connect(dbConfig.url)
.then(() => {
// ...
})
.catch(err => {
// ...
process.exit();
});
require("./app/routes/user.routes.js")(app);
require("./app/routes/task.routes.js")(app);
require("./app/routes/login.routes.js")(app);
app.listen(3333, () => {
console.log("Server is listening on port 3333");
});
当用户单击“登录”按钮时,来自前端控制器的方法称为:
前端-login.controller.js:
vm.login = function() {
userService.getUserByUsername(vm.username).then(user => {
if (user.password === vm.password) {
console.log("Login ok");
loginService.login(user).then(($window.location.href = "/#!main"));
} else {
console.log("Login not ok");
}
});
};
后端-login.controller.js:
exports.login = (req, res) => {
req.session.userId = req.body._id;
req.session.save(function(err) {
console.log(err); // prints out "undefined", so there's no error
});
console.log(req.session);
res.status(200).send({
message: "Login ok"
});
};
前端LoginController打印出“ Login ok”(假设输入正确的凭据),然后将我重定向到使用main.controller.js
的“ main”页面:
与此同时,后端登录控制器将打印出以下内容:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
userId: '5b4746cafe30b423181ad359' }
因此,会话内容中肯定有一个userId
。但是,当我重定向到main.html
并调用main.controller.js
时,它将调用:
loginService.getSession().then(data => console.log(data));
(我只想检查userId是否仍在会话中,稍后我将执行一些有用的操作)
前端LoginService中的getSession()
方法仅执行$http
调用:
function getSession() {
return $http.get("http://localhost:3333/session").then(
function(response) {
return response.data;
},
function(error) {
console.log(error.status);
}
);
}
此方法调用后端LoginController中定义的方法:
exports.getSession = (req, res) => {
console.log(req.session);
if (req.session.userId) {
res
.status(200)
.send({ message: "Session existing with userId " + req.session.userId });
} else {
res.status(404).send({ message: "Session not existing" });
}
};
前端调用在控制台中打印状态代码404,而在后端,我得到以下输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } }
(不存在userId
...)
还有一件事...在一些教程中,我看到他们正在使用cookie-parser
。但是,当我尝试使用它时,我没有从数据库中获取任何数据,仅显示静态文本。所以我暂时将其从server.js
中删除了。
编辑:
我尝试将MongoStore添加到我的应用中:
const MongoStore = require("connect-mongo")(session);
...
app.use(
session({
name: "app.sid",
secret: "G4m1F1c4T10n_@ppL1c4t10N",
resave: true,
saveUninitialized: false,
cookie: { maxAge: 600000 },
store: new MongoStore({ url: "mongodb://localhost:27017/myAppDb" })
})
);
...但是什么都没有改变。
如何使我的会话正常工作?
答案 0 :(得分:0)
正如我在与几个人交谈后发现的那样,会议或多或少被弃用,并且处理这些问题的新方法是令牌。所以我改用JWT,它的运行效果很好。