我正在努力实现我自己的自定义密码重置,该重置会发送一封电子邮件,用户将在其中访问一个页面来重置其密码。
到目前为止,我已经生成了一个唯一的 token ,该 token 被放入 http get 请求链接中并通过电子邮件发送给用户。
当用户单击链接时(例如 mywebsite.com/verifypasswordreset?id=96rZyAWLTu
)
我有一条获取 token 的快速路线:
//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 云代码函数来验证 token 是否存在,如果存在,它会通过发送包含用于重置密码的表单的 html 进行响应。 (resetpassword.html
)
此时,resetpassword.html
页面的网址中仍然嵌入了 token (mywebsite.com/verifypasswordreset?id=96rZyAWLTu
),但是,一旦用户提交表单,它就会执行 http post 并发布新密码,将 token 留在链接中,因此我不知道哪个 token 与密码重置相关联?
//Reset Password
app.post('/resetpassword', function(req, res) {
res.send('You sent the password "' + req.body.password + '".');
});
当用户提交表单以更改密码时,如何以某种方式从当前网址 (mywebsite.com/verifypasswordreset?id=96rZyAWLTu
) 获取 token 并将其包含在 http post 请求中,以便我的 Node js 应用程序可以读取它并知道哪个 token 与密码重置相关联?
或者,他们是跟踪 token 的更好、更安全的方式吗?
*注意忽略我正在使用 http,我将购买 SSL 证书并在启动前使用 https。
最佳答案
当您只是发送resetpassword.html 页面时,我不认为验证 token 有什么意义。但是,在实际更新用户密码时必须验证 token 。因此,这里有一个稍微修改过的工作流程:
用户单击链接(例如 mywebsite.com/passwordreset?id=96rZyAWLTu)
app.get('/passwordreset', function(req, res) {
res.sendFile(path.join(__dirname + '/website/resetpassword.html'));
});
您的重置密码页面的 URL 仍嵌入了 token 。现在,用户提交表单,它会执行 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'));
}
});
关于javascript - Node js - 如何安全地将 token 从 http get 请求传递到 html 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36936330/