Node.js Express+;护照可以';不要读闪信
我有我的Express+Passport+Firebase项目,在那里我通过本地策略处理身份验证。因为我发现Passport将负责身份验证过程,所以我还发现它将接受flash消息作为Node.js Express+;护照可以';不要读闪信,node.js,typescript,express,flash,passport.js,Node.js,Typescript,Express,Flash,Passport.js,我有我的Express+Passport+Firebase项目,在那里我通过本地策略处理身份验证。因为我发现Passport将负责身份验证过程,所以我还发现它将接受flash消息作为done()函数(在策略中)的第三个参数。但我不知道怎么读: 我猜我设置和阅读flash消息的流程是: 使用NPM安装 导入Express中间件后设置它: 从“连接闪存”导入*为闪存; ... 常量app=express(); ... 应用程序使用(flash()); 根据以下内容在快速路线中配置Passport身
done()
函数(在策略中)的第三个参数。但我不知道怎么读:
我猜我设置和阅读flash消息的流程是:
从“连接闪存”导入*为闪存;
...
常量app=express();
...
应用程序使用(flash());
//POST-/api/v1/admin/oauth/login
转发器(
“/login”,
async(req:Request,res:Response)=>{/*验证输入的中间件函数*/},
passport.authenticate('local'{
failureRedirect:“/api/v1/admin/oauth/login”,
failureFlash:正确
}),
异步(req:Request,res:Response)=>{/*成功登录后的函数*/
);
done()
方法中包括闪存消息:从“passport local”导入{Strategy as LocalStrategy};
从“../../config/database”导入数据库;
从“bcryptjs”导入*作为bcrypt;
导出默认的新LocalStrategy({usernameField:'email'},异步(电子邮件,密码,完成)=>{
const ref=db.collection(“用户”).doc(电子邮件);
试一试{
const doc=wait ref.get();
如果(!doc.存在){
返回完成(null,false,{error:'error email'});
}
const user=doc.data();
const match:boolean=wait bcrypt.compare(密码,user.password);
如果(!匹配){
返回完成(null,false,{error:'错误密码'});
}
user.id=doc.id;
删除用户密码;
返回完成(空,用户);
}捕获(错误){
返回完成(错误);
}
});
req.flash('error')
读取闪存消息://GET-/api/v1/admin/oauth/login
router.get('/login',(请求:任意,请求:响应)=>{
常量结果:IResult={
消息:“”,
数据:空,
好:错
};
如果(请求闪存(“错误”)){
resultado.message=req.flash('error');
控制台日志(请求闪存(“错误”);
}
返回res.status(400).json(结果);
});
我以为它在理论上在我脑海中运行,直到第5步,
req.flash('error')
中有一个空数组。我做错了什么?你传递的flash消息错了
done()
的第三个参数应该是一个包含type
和message
字段的对象:
return done(null, false, { message: 'Wrong email' });
该类型默认为error
此API似乎没有明确的文档记录,但在Passport.js文档的“配置”一章中显示
我创建了一个可重复性最低的工作示例。我一直在搜索,找到了一个解决方案,但在第二次登录尝试中它仍然有效 我修改了问题中的步骤以使其生效:
从“连接闪存”导入*为闪存;
...
常量app=express();
...
应用程序使用(flash());
//POST-/api/v1/admin/oauth/login
转发器(
“/login”,
async(req:Request,res:Response)=>{/*验证输入的中间件函数*/},
passport.authenticate('local',{
failureFlash:没错,
failureRedirect:“/api/v1/admin/oauth/login”
}),
异步(req:Request,res:Response)=>{/*成功登录后的函数*/
);
//GET-/api/v1/admin/oauth/login
路由器.get('/login',(请求:请求,回复:响应)=>{
常量结果:IResult={
消息:“Auth ok”,
数据:空,
好的,没错
};
let状态:编号=200;
const flashMessage:any=req.flash('error');
if(flashMessage.length){
resultado.message=flashMessage[0];
resultado.ok=false;
状态=400;
}
返回res.status(status).json(result);
});
done()
方法中包括闪存消息:从“passport local”导入{Strategy as LocalStrategy};
从“../../config/database”导入数据库;
从“bcryptjs”导入*作为bcrypt;
导出默认的新LocalStrategy({usernameField:'email'},异步(电子邮件,密码,完成)=>{
const ref=db.collection(“用户”).doc(电子邮件);
试一试{
const doc=wait ref.get();
如果(!doc.存在){
返回完成(null,false,{message:'error email'});
}
const user=doc.data();
const match:boolean=wait bcrypt.compare(密码,user.password);
如果(!匹配){
返回完成(null,false,{消息:“错误的密码”});
}
user.id=doc.id;
删除用户密码;
返回完成(空,用户);
}捕获(错误){
返回完成(错误);
}
});
Flash消息仅在请求的生命周期内可用。向/login
发出HTTP-POST
请求将获得使用授权,并闪烁一条消息,该消息可以响应HTTP-POST
请求而适当呈现。HTTP-GET
请求是一个单独的请求,不会检索请求另一个HTTP POST
请求中的闪存消息。@OLUWAFEMIULE不正确。闪存消息存储在会话中,可在后续请求中使用。这是闪存消息的记录行为。文档一定是错误的。@OLUWAFEMIULE source?文档读取“使用闪存消息需要req.fl