Node.js Web应用:Passport.js failureRedirect时在ejs显示失败消息
Passport.js 认证失败消息在EJS模板中渲染方案
failureMessage不会自动注入为EJS可直接读取的模板变量,Passport默认会把认证失败消息存入req.session.messages数组,手动在渲染登录页时取出传递给模板即可。
具体实现步骤
确认中间件注册顺序正确
必须先注册express-session中间件,再初始化Passport,否则session存储消息的逻辑不会生效,参考配置:const session = require('express-session'); // session中间件要放在passport初始化之前 app.use(session({ secret: '替换为你的项目专属session密钥', resave: false, saveUninitialized: false })); app.use(passport.initialize()); app.use(passport.session());原有的登录POST接口配置不需要修改,保持原有写法即可:
app.post('/login', passport.authenticate('local', { failureRedirect: '/login', successRedirect: "/secrets", failureMessage: "Incorrect password" }));修改登录页GET路由逻辑
在渲染login模板前,从session中取出失败消息,传递给模板变量,取完后清空session里的消息避免刷新后残留:app.get('/login', (req, res) => { // 取最新的一条认证失败消息,无消息时传空字符串 const failureMessage = req.session.messages?.at(-1) || ''; // 清空session中存储的消息 req.session.messages = []; res.render('login', { failureMessage }); });调整EJS模板代码
增加非空判断,只有存在错误消息时才渲染对应标签,避免出现空的a标签:<% if (failureMessage) { %> <a><%= failureMessage %></a> <% } %>
如果需要区分不同错误场景(比如用户名不存在、密码错误分别提示),可以在本地认证的验证逻辑里传入自定义消息,Passport会自动把消息存入req.session.messages数组,渲染逻辑和上述完全一致。
内容的提问来源于stack exchange,提问作者Michael Mo
相关产品推荐
相关产品推荐

