首页 > 解决方案 > Express + PassportJS 无法读取 flash 消息

问题描述

我有我的 Express + Passport + Firebase 项目,我使用本地策略处理身份验证。由于我发现 Passport 会处理身份验证过程,所以我还发现它会接受 flash 消息作为done()函数的第三个参数(在策略中)。但我不确定如何阅读它们:

我想我设置和读取 Flash 消息的流程是:

  1. 使用 NPM安装连接闪存。

  2. 导入后设置 Express 中间件:

import * as flash from 'connect-flash';
...
const app = express();
...
app.use(flash());
  1. 根据文档在 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 */
);
  1. done()根据Passport 配置文档,在方法中包含 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);
    }
});
  1. 使用以下命令阅读 Flash 消息req.flash('error')
// 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')有一个空数组。我做错了什么?

标签: node.jstypescriptexpressflashpassport.js

解决方案


你传递的闪光信息是错误的!

的第三个参数done()应该是一个带有字段type和的对象message

return done(null, false, { message: 'Wrong email' });

类型默认为error.

此 API 似乎没有明确记录,但显示在Passport.js 文档的配置章节中验证回调部分的第三个示例中。

我创建了一个带有最小可重现工作示例的存储库。


推荐阅读