我正在处理一个忘记密码的页面,并试图找出最佳方法。目前,当用户访问该页面时,它会询问他们的电子邮件。该脚本会检查该帐户是否存在,并向他们发送一封电子邮件,其中包含单击以重置其密码的链接。
该链接包含一个令牌(只是md5(uniqid())
)以及当用户选择新密码时与该数据库匹配的电子邮件地址。它将令牌存储在数据库表password_resets
中,并且从现在开始24小时的到期日期以及其帐户详细信息的外键。
当用户选择新密码时,它会将令牌与password_resets
表格相匹配,该电子邮件与该外键的电子邮件地址相关联,并确保在设置新密码和删除之前设置过期日期。来自password_resets
的记录。
这是一种有效的方法吗?为此目的设置整个表几乎是多余的。有没有更好的方法呢?
答案 0 :(得分:3)
通常我会推荐相同的方法,但我注意到你以同样的方式写了一个有效的方法。实际上可以有一个。我正在使用following库
<?php
# $key is super secret
$key = "someRandomKey";
function gen_token($email,$username) {
$token = array(
"email" => $email,
"username" => $username,
"created" => time()
);
return JWT::encode($token, $key);
}
function validate_token($token,$newPassword) {
# Step below only works on valid token generates on your server
$data = (array) JWT::decode($jwt, $key, array('HS256'));
$currentTime = time();
# Validate difference between $currentTime and $data["created"]
# If time valid update password
}
?>
此方法可以显着减少数据库延迟,还可以选择在令牌本身上存储一些验证数据。