【发布时间】:2022-08-06 22:07:42
【问题描述】:
我正在尝试将当前用户存储在反应状态,以便更好地管理为登录用户获取数据。在后端,创建和验证用户正常工作,我可以访问 req.user,但是,当我尝试创建特定路由以返回当前用户时,req.user 未定义。两个调用的 cookie 看起来也不同,其中一个附加了护照属性,而另一个没有。
会话设置:
app.use(session({
secret: process.env[\"SECRET\"],
resave: false,
saveUninitialized: true,
store: MongoStore.create({mongoUrl: process.env[\"MONGO_URI\"]
}), //Connects session store to cookie
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 31 //Setting cookie to last around a month
}
}));
初始化护照:
require(\"./config/passport\");
app.use(passport.initialize());
app.use(passport.session());
配置/护照文件:
const passport = require(\"passport\");
const LocalStrategy = require(\"passport-local\").Strategy;
const User = require(\"../config/database\").user;
const validatePassword = require(\"../lib/passwordUtils\");
const verifyUserCallback = (email, password, done) => {
User.findOne({email: email})
.then((user) => {
if(!user){
return done(null, false); //Returns 401. Should be handled
}
const isValid = validatePassword(password, user.hash, user.salt);
if(isValid){
return done(null, user)
} else{
return done(null, false); //Credentials are not valid
}
})
.catch((err) => {
done(err);
});
};
const strategy = new LocalStrategy({usernameField: \"email\"}, verifyUserCallback);
passport.use(strategy);
passport.serializeUser((user, done) => { //Persists data after session
done(null, user.id)
});
passport.deserializeUser((userId, done) => {
User.findById(userId)
.then((user) => {
done(null, user);
})
.catch((err) => done(err));
})
从登录文件访问 req.user 可以正常工作:
router.post(
\"/login\",
passport.authenticate(\"local\"),
(req, res) => {
if(req.user){
console.log(req.user)
console.log(req.session)
res.status(200).json({user: req.user})
} else{
res.status(401).json({error: \"Username and password do not match\"})
}
}
);
注册用户:
router.post(\"/register\", (req, res) => {
const saltHash = genPassword(req.body.password);
const salt = saltHash.salt;
const hash = saltHash.hash;
//Going to see if user exists
User.findOne({email: req.body.email}).then((user) => {
if(!user){ //If there is no current user make a new one
const newUser = new User({
name: req.body.name,
email: req.body.email,
age: req.body.age,
salt: salt,
hash: hash
});
newUser.save().then((user) => {
req.isAuthenticated = true; //Pretty sure this works
res.status(200).json({user: user})
});
} else{
//User exists
req.isAuthenticated = false;
res.status(401).json({error: \"User already exists\"})
}
}).catch(err => console.log(err));
});
但是 checkAuthentication 文件是问题所在。它没有正确返回 req.user 而是说它是未定义的。
router.get(\"/checkAuthentication\", (req, res) => {
console.log(req.user) //Undefined
if(req.isAuthenticated){
res.status(200).json({user: req.user})
} else{
res.status(401).json({user: \"User is not logged in\"})
}
});
两人的饼干看起来也不同。以下是用户刚刚登录时的示例 cookie:
Session {
cookie: {
path: \'/\',
_expires: 2022-06-23T23:14:13.366Z,
originalMaxAge: 2678400000,
httpOnly: true
},
passport: { user: \'628bf9107d0bbe14b560609d\' }
}
当经过身份验证但不仅仅是登录或注册时:
Session {
cookie: {
path: \'/\',
_expires: 2022-06-23T23:15:04.343Z,
originalMaxAge: 2678400000,
httpOnly: true
}
}
标签: node.js reactjs passport.js session-cookies express-session