背景
我有一个具备CRUD功能的MEAN应用程序,并已经使用Postman进行了全面测试。我一直在尝试将登录信息持久化,但一直没有成功。我已经阅读并尝试了以下内容:
- 护照文档
- toon io关于登录的博客
- Express session
- Scotch io, 简单的Node身份验证设置和本地
- 还有其他一些轻松阅读的材料(SO问题很多)
但我只能注册并登录用户,无法使用会话持久化登录。
我的应用程序
这里是完整的Github repo链接(如果你想查看最新更改,请查看develop分支)
我对身份验证/登录的理解
这里是我的用户登录理解,包括来自项目的代码示例以及Postman结果和控制台日志的屏幕截图。
Passport设置
我有以下auth.js文件,它配置了护照。
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
module.exports = function(app, user){
app.use(passport.initialize());
app.use(passport.session());
// passport config
passport.use(new LocalStrategy(user.authenticate()));
passport.serializeUser(function(user, done) {
console.log('serializing user: ');
console.log(user);
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
user.findById(id, function(err, user) {
console.log('no im not serial');
done(err, user);
});
});
};
这个函数在服务器文件中被调用,如下所示:
//code before
var user = require('./models/user.js');
var auth = require('./modules/auth.js')(app, user);
// code after
登录路由
在我的路由中,我有以下登录路由
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.status(401).json({
err: info
});
}
req.logIn(user, function(err) {
if (err) {
return res.status(500).json({
err: 'Could not log in user'
});
}
res.status(200).json({
status: 'Login successful!'
});
});
})(req, res, next);
});
这条路由已经在Postman中测试过,可以正常使用。我输入了用户名和密码并获得了以下响应。
当访问此路由时,我们还可以在控制台中看到用户的序列化。
接下来该怎么办?
这就是我困惑的地方。我有一些问题。
- 用户现在是否在我的服务器上的会话中?
- 我应该将
req.session.passport.user
发送回客户端吗? - 所有未来请求都需要会话ID吗?
测试会话
我设置了第二个路由以测试会话,如下所示:
router.get('/checkauth', passport.authenticate('local'), function(req, res){
res.status(200).json({
status: 'Login successful!'
});
});
我认为,passport.authenticate('local')
这一部分的作用是在允许通过路由之前测试用户会话是否存在,但即使在登录后运行它,我仍然无法获得 200 响应。
这个路由是否需要在头部传递 req.session.passport.user
或者在需要身份验证的 http 请求的数据参数中传递?
如果我漏掉了什么或者对某些事情的理解有误,请告诉我,非常感谢你们的帮助。