我有一个具有CRUD功能的MEAN应用程序,已通过邮递员进行了全面测试。我一直在尝试保持登录一段时间,但没有运气。我已阅读并尝试以下
但是我只能注册并登录用户,而无法通过会话永久登录。
这是指向完整github存储库的链接(如果您正在寻找最新的更改,请查看developer分支)
这是我对用户登录的理解,包括项目中的代码示例,邮递员结果的屏幕截图以及控制台日志。
我有以下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);
});
这条路线的工作原理与邮差测试。我输入详细信息“ joe”和“ pass”,并得到以下答复。
点击此路由后,我们还可以在控制台中看到用户已被序列化。
这是我迷路的地方。我有几个问题。
req.session.passport.user
寄回给客户吗?我有第二个路由设置用于测试会话,如下所示
router.get('/checkauth', passport.authenticate('local'), function(req, res){
res.status(200).json({
status: 'Login successful!'
});
});
该部分passport.authenticate('local')
(我认为)是在授予访问路由之前测试用户会话是否存在的,但是即使运行后,即使运行登录,我也都不会收到200响应。
此路由是否期望req.session.passport.user
传递头部或作为需要auth的http请求上的数据参数?
如果我错过了任何事情或理解不对,请告诉我,我们将不胜感激。谢谢大家
用户现在在我的服务器上的会话中吗?
不,您需要使用express-session
中间件才能app.use(passport.session());
将会话实际存储在内存/数据库中。该中间件负责为浏览器设置cookie,并将浏览器发送的cookie转换为req.session
对象。PassportJS仅使用该对象进一步反序列化用户。
我应该将req.session.passport.user发送回客户端吗?
如果您的客户希望user
在登录时获得资源,则应该这样做。否则,我看不出有任何理由将用户对象发送给客户端。
在以后的所有请求中都需要会话ID吗?
是的,对于以后的所有请求,都需要会话ID。但是,如果您的客户端是浏览器,则无需发送任何内容。浏览器会将会话ID存储为Cookie,并将其发送给所有后续请求,直到Cookie过期。express-session
将读取该Cookie并将相应的会话对象附加为req.session
。
测试会议
passport.authenticate('local')
用于从POST正文验证用户凭据。您仅应将此用于登录路由。
但是要检查用户是否在所有其他路由中均已通过身份验证,可以检查是否req.user
已定义。
function isAuthenticated = function(req,res,next){
if(req.user)
return next();
else
return res.status(401).json({
error: 'User not authenticated'
})
}
router.get('/checkauth', isAuthenticated, function(req, res){
res.status(200).json({
status: 'Login successful!'
});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句