我目前正在使用MERN堆栈应用程序,该应用程序将使用链接到我的Mongo数据库的登录/注册表单。我已经成功创建了一个用户,对该用户的密码进行哈希处理,然后将该用户存储到数据库中,以及通过从数据库中检查其凭据来登录该用户。
当尝试采用行业标准的解决方案时,我决定与Passport和Express-session一起为每个用户登录时实施身份验证和会话。创建/登录用户后,护照会正确存储其信息进入req.user
,然后创建会话并使用req.session
登录。以下是req.user的控制台日志,后跟req.session:
user with id xxx serialized
email: ...
password: ...
isAuthenticated: true
Session {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
passport: {user: xxx } }
所有这些都将在我登录后立即显示,据我所知,这意味着已创建一个会话,并且用户已正确序列化。但是,当我转到Web应用程序上的新页面时,我失去了会话-req.user
变得不确定,并且每次页面运行时req.sessionId
都会改变-这使我相信新的会话每次切换页面时都会创建一个带有空用户的用户(我在React的NavBar中运行fetch
方法,每次安装组件时都会触发该方法)。即使通过控制台日志证明创建了cookie,Google Chrome也无法准确地记录它们。
我的问题是:为什么我切换页面时会话无法持续?我的目标是跟踪此会话数据,以传递给我的React前端以呈现特定内容。有没有更好的方法来解决这个问题?以下是我的中间件订购:
app.use(session({
secret: 'test',
saveUninitialized: false,
resave: true
}));
app.use(passport.initialize());
app.use(passport.session());
以下是我在路由器文件中调用的方法:
router.get('/',function(req, res){
console.log(req.user);
console.log(req.session);
});
router.post('/login',passport.authenticate('local'), function(req,res)
{
console.log(req.user);
console.log(req.isAuthenticated());
console.log(req.session);
});
passport.serializeUser(function(user, done) {
console.log("user with id " + user._id + " serialized");
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
console.log("deserializing user with id " + id + " ");
User.findById(id, function(err, user) {
done(err, user);
});
});
这是我从前端获取的api调用:
componentDidMount(){
var current_user = "";
fetch("http://localhost:3001/users/", {
method: "get",
headers: {
'Accept':'application/json',
'Content-Type': 'application/json'
}
})
.then( (response)=> response.json())
.then( (response)=> {
if(response.user!==current_user){
current_user = response.user;
this.setState({
user: current_user
}), ()=> console.log(response);
}
})
}
我还知道当前fetch方法将无法正常工作:目标是使该框架正常工作并使其返回正确的ID。在什至没有机会将其传递到前端之前,会话和req.user日志记录不正确。任何和所有帮助将不胜感激。