node js - 如何安全地将令牌从http get请求传递到html页面?

时间:2016-04-29 10:47:43

标签: javascript html node.js security passwords

我正在努力实现自己的自定义密码重置功能,该功能会将用户带到页面的电子邮件重置为重置密码。

到目前为止,我已经生成了一个唯一的令牌,该令牌被放入一个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页面的网址仍然包含其中的令牌(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 app可以读取它并知道哪个令牌与密码重置相关联?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

您的重置密码网页的网址仍然嵌入了令牌。现在,用户提交表单,它会发送一个http帖子并发布新密码。

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'));
  }
});