我有我的 Express + Passport + Firebase 项目,我在其中使用本地策略处理身份验证。因为我发现 Passport 会处理身份验证过程,所以我还发现它会接受 flash 消息作为 done()
函数(在策略中)的第三个参数。但我不确定如何阅读它们:
我想我设置和读取即显消息的流程是:
安装 connect-flash与 NPM。
导入后设置Express中间件:
import * as flash from 'connect-flash';
...
const app = express();
...
app.use(flash());
- 根据 documentation 在 Express 路由中配置 Passport 身份验证:
// POST - /api/v1/admin/oauth/login
router.post(
'/login',
async (req: Request, res: Response) => { /* middleware function to validate input */ },
passport.authenticate('local', {
failureRedirect: '/api/v1/admin/oauth/login',
failureFlash: true
}),
async (req: Request, res: Response) => { /* function after success login */
);
- 根据 Passport configuration documentation,在
done()
方法中包含 flash 消息:
import { Strategy as LocalStrategy } from 'passport-local';
import db from '../../config/database';
import * as bcrypt from 'bcryptjs';
export default new LocalStrategy({ usernameField: 'email' }, async (email, password, done) => {
const ref = db.collection('users').doc(email);
try {
const doc = await ref.get();
if (!doc.exists) {
return done(null, false, { error: 'Wrong email' });
}
const user = doc.data();
const match: boolean = await bcrypt.compare(password, user.password);
if (!match) {
return done(null, false, { error: 'Wrong password' });
}
user.id = doc.id;
delete user.password;
return done(null, user);
} catch(error) {
return done(error);
}
});
- 使用
req.flash('error')
读取 flash 消息:
// GET - /api/v1/admin/oauth/login
router.get('/login', (req: any, res: Response) => {
const result: IResult = {
message: '',
data: null,
ok: false
};
if (req.flash('error')) {
resultado.message = req.flash('error');
console.log(req.flash('error'));
}
return res.status(400).json(result);
});
在第 5 步之前,我认为它在我的脑海中发挥了巨大的作用,其中 req.flash('error')
中有一个空数组。我做错了什么?
最佳答案
您传递的 Flash 消息有误!
done()
的第三个参数应该是一个包含字段type
和message
的对象:
return done(null, false, { message: 'Wrong email' });
类型默认为error
。
此 API 似乎没有明确记录,但显示在 3rd example of the Verify Callback section 中在 Passport.js 文档的配置一章中。
我创建了 a repo有一个最小可重现的工作示例。
关于node.js - Express + PassportJS 无法读取闪信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61062259/