当我从我的响应前端发出获取请求以使用password.authenticate('./ local)登录时,将调用我的password.serializeUser,但未设置password.deserializeUser(并且未设置req.user)。
我已经在stackoverflow上阅读了许多有关此问题的答案,但无济于事。这是下面的代码。
所有这些都发生在我在server.js上的路由之前:
module.exports = function(passport) {
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, async function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
const match = await bcrypt.compare(password, user.password);
if (!match) { return done(null, false); }
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
console.log('this gets called logged)
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log('this does NOT GET LOGGED');
User.findById(id, function(err, user) {
done(err, user);
});
});
};
这是护照配置文件:
fetch('http://localhost:5000/authentication/login', {
method: 'POST',
body: JSON.stringify(this.state.formData),
headers: {"Content-Type": "application/json"},
mode: 'cors'
})
.then(res => res.json())
.then(resObject => {
if (resObject.errors) {
console.log('errors')
} else {
this.props.dispatch(handleLoginuser(resObject.user))
this.setState({
redirect: true
})
}
});
这是登录路径的反应获取请求:
componentDidMount() {
fetch('http://localhost:5000/protectedroute', {
method: 'GET',
mode: 'cors',
credentials: 'include'
})
.then(res => res.json())
.then(resObject => {
if(resObject.loggedIn) {
this.setState({
loggedIn: true
})
}
});
}
以下是对另一个应受保护的随机路由的提取请求:
app.post('/authentication/login', passport.authenticate('local'), (req, res) => {
res.json({errors: false, user: req.user})
});
app.route('/protected')
.get(function(req, res) {
//req.user will be undefined!
if (req.user) {
return res.json({loggedIn: true})
} else {
return res.json({loggedIn: false})
}
})
以下是登录和受保护的路由:
http://fake.com/?user=123&name=ali
答案 0 :(得分:1)
在发送发帖请求时设置withCredentials: true
对我来说很有效。
axios.post(uri, {
email: email,
password: password
}, {
withCredentials: true
})
答案 1 :(得分:0)
我相信这是因为您在后端的发布/登录路线。
除非您使用官方文档中的样板代码(不适用于React),否则调用passport.authenticate中间件不会完成登录过程。
您需要调用req.login来完成登录过程。查看此示例
app.post('/authentication/login', (req, res, next) => {
passport.authenticate('local', (err, theUser, failureDetails) => {
if (err) {
res.status(500).json({ message: 'Something went wrong authenticating user' });
return;
}
if (!theUser) {
res.status(401).json(failureDetails);
return;
}
// save user in session
req.login(theUser, (err) => {
if (err) {
res.status(500).json({ message: 'Session save went bad.' });
return;
}
console.log('---123456789098765432345678---', req.user);
res.status(200).json({{errors: false, user: theUser}});
});
})(req, res, next);
});