1

我有一个忘记密码的简单功能,当用户请求更改密码时,他会收到一封带有令牌的电子邮件,点击它时他的电子邮件将被重定向到一个页面,该页面将接受他的新密码。

我所做的是,当我单击电子邮件中的链接时,服务器获取请求并且从链接中取出数据的函数使用数据呈现页面(使用 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 和它的视图文件夹中创建的。

4

1 回答 1

2

听起来你想要这个流程:

  1. 用户点击链接到/api/resetpassword...
  2. express 运行resetPasswordPage函数
  3. resetPasswordPage响应重置密码表单 HTML 页面,根据查询参数预先填写
  4. 我认为此时您不喜欢浏览器地址栏中的 URL,这就是您认为需要重定向的原因。但是你需要那些查询字符串参数,如果你重定向到 just /resetPassword,你会丢失它们。因此,您要么必须使用 URL(我会推荐它,因为它是最简单的),要么依赖会话状态和会话 cookie。但是,用类似的东西标记会话passwordResetOK=true可能会使您面临一大堆 CSRF 攻击,而_csrf查询字符串参数可以防止这些攻击。
  5. 您在这里不需要任何重定向,浏览器具有表单。下一步是让用户填写表格并提交<form method="post" action="/resetPassword">
  6. 浏览器可以POST /resetPassword
  7. express 将其路由到另一个更改密码的函数,然后发送回成功页面或重定向到主页或其他

长话短说,我认为您只需要接受 URL 的本来面目,并且在密码重置操作完成之前不需要重定向。

于 2013-07-17T17:56:17.083 回答