node.js - Express + PassportJS 无法读取闪信

标签 node.js typescript express flash passport.js

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

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

  1. 安装 connect-flash与 NPM。

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

import * as flash from 'connect-flash';
...
const app = express();
...
app.use(flash());
  1. 根据 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 */
);
  1. 根据 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);
    }
});
  1. 使用 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() 的第三个参数应该是一个包含字段typemessage 的对象:

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/

相关文章:

javascript - 巴别塔似乎不起作用

javascript - 如何在 ejs 文件中使用外部 javascript 文件

node.js - js Pub/Sub 出现错误 : Must specify an `id` when calling `Model.room(id)` with Sails.

javascript - 使用Guards(Roles、JWT)获取用户数据

reactjs - 如何解决 useReducer 钩子(Hook)的类型错误 "argument is not assignable to parameter of type never"?

node.js - 应用程序正在运行但无法在浏览器中打开?显示页面不可用

javascript - 如何在node js中的readline.on函数下使用await函数

javascript - 人们分配变量后,Angular 6/Typescript 属性为 "undefined"

javascript - 如何将数据从 express 传递到我的 hbs View

mysql - Node.js/Express - 在哪里放置 MySQL 连接?