javascript - 如何在 React 中使用来自您的 passportjs 策略的访问消息
问题描述
如果您有一个反应应用程序并且不想connect-flash
用来访问本地策略生成的消息,您可以使用以下内容:
我的护照本地策略,我使用的是 sqlite db:
passport.use(
new LocalStrategy({ usernameField: 'name' },
(name, password, done) => {
//Match user
db.get(`SELECT * FROM Users WHERE name = '${name}'`, (err, user) => {
if(err) throw err;
if(!user) {
return done(null, false, { message : 'Username not registered' });
}
//Match password
bcrypt.compare(password, user.password, (err, isMatch) => {
if(err) throw Error;
if(isMatch) {
done(null, user, { message : 'Log in successful' });
} else { done(null, false, { message : 'Password incorrect' })
}
});
})
})
);
解决方案
您可以为 /login 路由使用自定义回调函数:
app.post('/login', (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
if (err) { return next(err); }
if (!user) { return res.json(info); }
req.logIn(user, (err) => {
if (err) { return next(err); }
return res.json(info);
});
})(req, res, next);
});
info 参数包含在 done() 中作为第三个参数从策略传递的对象,并且可以添加到 res 的主体中,因此被 react 使用。
推荐阅读
- linux - 用于创建具有唯一随机标题和新文本的新 txt 文件的 Bash 脚本
- django - Django - ManyToManyField - 显示管理表单
- angular - Kendo Angular Grid 响应式设计
- css - 使卡片变暗。(蚂蚁设计)
- excel - RTE 438:对象不支持此属性或方法 - 根据字典键更新现有项目值
- javascript - 在可变高度网格行中处理@material-ui Skeleton 缩放的好方法?
- r - ggplot中的排序列
- c# - 无法实例化 Xrm.Utility
- angular - Angular CLI,NativeElement.style - 所有属性都是空的,为什么?
- node.js - net.socket end() 与 destroy() 在 FIN_WAIT2 中挂起连接