【问题标题】:node js - How to safely pass token from http get request to html page?node js - 如何安全地将令牌从 http get 请求传递到 html 页面?
【发布时间】:2016-08-24 11:54:51
【问题描述】:

我正在努力实现我自己的自定义密码重置,它会发送一封电子邮件,用户正在访问页面以重置他们的密码。

到目前为止,我已经生成了一个独特的令牌,它被放入一个 http get 请求链接并通过电子邮件发送给用户。

当用户点击链接时(例如mywebsite.com/verifypasswordreset?id=96rZyAWLTu

我有一条获取令牌的快速路线:

//Verify Password Reset
app.get('/verifypasswordreset', function(req, res) {
    Parse.Cloud.run('verifyPasswordReset', { token: req.param("id") }, {
      success: function(user) {   
          res.sendFile(path.join(__dirname + '/website/resetpassword.html'));
      },
      error: function(error) {
          res.sendFile(path.join(__dirname + '/website/404.html'));
      }
    }); 
});

然后我运行 Parse 云代码函数来验证令牌是否存在,如果存在,它会通过发送包含用于重置密码的表单的 html 来响应。 (resetpassword.html)

此时resetpassword.html 页面的 url 中仍然嵌入了令牌 (mywebsite.com/verifypasswordreset?id=96rZyAWLTu) 但是,一旦用户提交表单,它就会执行 http 发布并发布新密码,将令牌留在链接,因此我不知道哪个令牌与密码重置相关联?

//Reset Password
app.post('/resetpassword', function(req, res) {
    res.send('You sent the password "' + req.body.password + '".');
});

当用户提交表单以更改密码时,如何以某种方式从当前 url (mywebsite.com/verifypasswordreset?id=96rZyAWLTu) 获取令牌并将其包含在 http post 请求中,以便我的节点 js 应用程序可以读取它并知道哪个令牌是与密码重置相关联?

或者,他们是一种更好、更安全的方式来跟踪令牌吗?

*注意忽略我正在使用 http 我将购买 SSL 证书并在启动前使用 https。

【问题讨论】:

    标签: javascript html node.js security passwords


    【解决方案1】:

    当您只是发送一个 resetpassword.html 页面时,我看不到验证令牌的意义。但是,必须在实际更新用户密码时验证令牌。所以,这里有一个稍微修改过的工作流程:

    用户点击链接(例如 mywebsite.com/passwordreset?id=96rZyAWLTu)

    app.get('/passwordreset', function(req, res) {
          res.sendFile(path.join(__dirname + '/website/resetpassword.html'));
    });
    

    您的重置密码页面的 URL 仍然嵌入了令牌。现在,用户提交表单,它执行 http post 并发布新密码。

    app.post('/passwordreset', function(req, res) {
    Parse.Cloud.run('verifyPasswordReset', { token: req.param("id") }, {
      success: function(user) {   
               //update user's password here
               res.send('You sent the password "' + req.body.password + '".');
      },
      error: function(error) {
          res.sendFile(path.join(__dirname + '/website/error.html'));
      }
    }); 
    

    【讨论】:

    • 这并不能解决问题,用户提交表单后我没有令牌了。我刚刚尝试在用户发出帖子请求时访问req.param("id"),但它返回“未定义”?如何传递令牌?
    • 带有令牌的完整网址是否显示在浏览器中?如果是这样,你能分享你的前端代码吗?
    • 如果你有
      ,那显然是行不通的。只需使用
      标签或空操作即可。
    • 就是这样!我摆脱了 action="passwordreset" 谢谢
    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 2019-10-27
    • 2015-07-05
    • 2016-02-03
    • 2018-06-10
    • 2020-11-13
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多