我有一个忘记密码的简单功能,当用户要求更改密码时,他会收到一封带有令牌的电子邮件,并在点击它时发送电子邮件,他将被重定向到一个将带有他新密码的页面。
我所做的是当我点击电子邮件中的链接时,服务器获取请求并且一个函数从链接中获取数据呈现带有数据的页面(使用res.render)然后它应该重定向到呈现的页面
我面临的问题是,当我点击链接时,我正在获取数据和页面,但我不能让res.redirect()工作。
我的链接看起来像这样
http://localhost:3000/api/resetpassword?_csrf=ab8aa6a41567f817330e3e0a214725f8b2f88b487d5bef16f162e033c6a63dc41933511ddb79cb44ca049f472b3e0c593dbbaf&email=dummyEmail%2540dumyurl.ca
然后我使用app.get()在服务器上获取请求。
app.get('/api/resetpassword', Admin.resetPasswordPage);
我的渲染和重定向功能看起来像这样;
resetPasswordPage: function (req, res, next) {
req.query.email = decodeURIComponent(req.query.email) ;
res.render('resetPassword', {
Email: req.query.email,
Csrf : req.query._csrf,
}, function (err, html) {
console.log("TESTING HTML ", html);
if (!err)
res.redirect("/resetPassword");
});
}
渲染成功,因为我在html参数中获得了页面的完整HTML,但问题是如何重定向到该页面。该页面是在EJS及其视图文件夹中制作的。
答案 0 :(得分:2)
听起来你想要这个流程:
/api/resetpassword...
resetPasswordPage
函数resetPasswordPage
使用重置密码表单HTML页面进行响应,并根据查询参数预先填写/resetPassword
,你就会失去它们。所以你要么必须使用URL(我建议这是最简单的),要么依赖会话状态和会话cookie。但是,使用passwordResetOK=true
之类的标记会话可能会让您面临一大堆CSRF攻击,_csrf
查询字符串参数可以防止这种情况发生。<form method="post" action="/resetPassword">
POST /resetPassword
长话短说,我认为你只需要接受URL就是这样,在密码重置操作完成之前你不需要重定向。