我正在尝试向用户显示一个页面(前端),向他们展示了他们的登录历史,但是我有点困惑,需要一些帮助。
使用Express,并将我的会话存储在mongoStore中,如下所示:
app.use(session({
secret: process.env.SECRET,
key: process.env.KEY,
resave: false,
saveUninitialized: false,
store: new MongoStore({
mongooseConnection: mongoose.connection
})
}));
我的登录策略是本地的,位于我的userController文件中,如下所示:
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login!',
successRedirect: '/',
successFlash: 'You are now logged in!'
});
同时我的处理程序中有一个helper函数,如下所示:
const passport = require('passport');
const mongoose = require('mongoose');
const User = mongoose.model('User');
const sess = passport.use(User.createStrategy()); // creates strategy during every user login
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
我知道我必须在每次用户登录时创建一个令牌,但我相信已经使用序列化功能(在这种情况下是它的电子邮件)已经爬行但是我如何跟踪用户以便在下一个会话期间,我可以检索他们上次登录的日期并将其呈现(显示)给他们?身份验证和登录工作完美,我只需要知道我将如何显示他们以前登录的任何其他未来登录时间并点击特定路线(不是主页)。提前谢谢
答案 0 :(得分:1)
您应该实现自定义的身份验证处理程序,以存储用户成功登录时所需的数据,
Router.post('/login', (req, res, next)=>{
passport.authenticate('local', function(err, user) {
if (err) { //do something when user failed to authenticate... }
if (!user) { //do something when user not found }
//explicitly call req.logIn, then save related information you need
req.logIn(user, function(err) {
if (err) { //do something when user failed to login }
//for example, save the current time to user collection
Users.updateLastLoginTime(user.id, Date.now()).then(function(){
//when all set, send the response
return res.json(true);
})
});
})(req, res, next);
})
答案 1 :(得分:0)
除了@MarkoCen的答案外,类似的内容也可能是用户模型中的方法:
// set a time for the login
UserSchema.statics.updateLastLoginTime = function(userId, currentTime, callback) {
User.findOne({ _id: userId }, 'lastLoginTime')
.exec(function(error, user){
if (error) {
return callback(error);
} else if(!userId) {
var err = new Error('User not found.');
err.status = 401;
return callback(err);
}
user.lastLoginTime = currentTime;
});
};