我正在努力实现自己的自定义密码重置功能,该功能会将用户带到页面的电子邮件重置为重置密码。
到目前为止,我已经生成了一个唯一的令牌,该令牌被放入一个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。
答案 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'));
}
});