node.js - 护照反序列化用户未被调用
问题描述
当我从我的反应前端发出获取请求以使用 passport.authenticate('./local) 登录时,我的 passport.serializeUser 被调用但 passport.deserializeUser 不是(并且 req.user 未设置)。
我已经在 stackoverflow 上阅读了很多关于这个问题的答案,但无济于事。下面是我的代码。
所有这些都发生在我在 server.js 上的路由之前:
//Express body parser
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.json());
//Express Session
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true,
cookie: {
secure: false
}
}));
// Passport config
require('./config/passport')(passport);
//Passport Middleware
app.use(passport.initialize());
app.use(passport.session());
这是护照配置文件:
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})
}
})
解决方案
withCredentials: true
在发送帖子请求时进行设置对我有用。
axios.post(uri, {
email: email,
password: password
}, {
withCredentials: true
})
推荐阅读
- php - 记住我不适用于 JSON 登录
- dynamics-crm - Dynamics 365 门户 odata 列表 URL 异常
- gradle - 为什么Gradle在使用dependsOn时总是按字母顺序执行任务依赖
- amazon-web-services - 例如不接受传入连接的健康检查
- python-3.x - 如何在python3中可靠地测试输出终端的颜色能力?
- pandas - 带有条形图的 Pandas DataFrame
- jwplayer - 如何在 javascript 中使用 jwplayer API
- java - 以编程方式删除自定义操作栏上的按钮
- javascript - 删除与 Jquery 相同的 Attr 中的元素
- css - IE11按钮文字溢出按钮,如果太大,应该扩大按钮宽度并移动到新行