【发布时间】:2020-07-18 14:18:49
【问题描述】:
我有我的 Express + Passport + Firebase 项目,我在其中使用本地策略处理身份验证。由于我发现 Passport 会处理身份验证过程,所以我还发现它会接受 flash 消息作为 done() 函数的第三个参数(在策略中)。但我不确定如何阅读它们:
我想我设置和阅读 Flash 消息的流程是:
使用 NPM 安装 connect-flash。
导入后设置 Express 中间件:
import * as flash from 'connect-flash';
...
const app = express();
...
app.use(flash());
- 在 Express 路由中根据 documentation 配置 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 */
);
- 在
done()方法中包含flash消息,根据Passport configuration documentation:
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 消息仅在请求的生命周期内可用。向
HTTP POST发出/login请求会获得使用权并闪烁一条消息,该消息可以适当地呈现以响应HTTP POST请求。HTTP GET请求是一个单独的请求,不会在另一个HTTP POST请求中检索闪现的消息。 -
@OluwafemiSule 这不正确。 Flash 消息存储在会话中,可用于后续请求。
-
这是闪存消息的记录行为。那么文档肯定是错误的。
-
其实我错了。闪过的消息是 cookie 的,可在后续请求中使用,但只能读取一次。
标签: node.js typescript express flash passport.js