忘记密码了



我需要实现一个登录页面的忘记密码。首先,我验证电子邮件,然后生成一个字符串,然后发送一个带有密钥和电子邮件的链接到特定的邮件。

我知道如何重置,但发生了什么接收到该邮件的链接

$message= "<a href='".base_url()."user/reset_pass/$key/$email'>";

是我提供的链接

基本流程应该是这样的:

  • 用户点击忘记密码
  • 验证邮件或用户id是否存在
  • 创建key
  • 更新数据库中用户行上的keytime(需要2列)
  • 创建包含链接的电子邮件,但只有KEY,电子邮件地址是不必要的,可能会被嗅探,这可能被用来破坏这个过程。

    <a href='".base_url()."user/reset_pass/$key'>

用户点击他们收到的电子邮件的链接

  • 运行用户控制器的reset_pass方法,并作为参数
  • 传递密钥。
  • 在Users表中查找

如果没有找到

  • 把用户扔到某个地方,可能是一个黑客

如果找到但超过时间限制

  • 生成另一封带有新密钥的电子邮件
  • 更新keytime

如果发现并且时间在限制内

  • 抛出用户重置密码视图

密码重置后

    更新用户表集keytime列为NULL

首先,您需要检查当用户单击忘记密码时会话是否存在。如果没有,那么设置电子邮件的验证方法,您将从用户获取。

像这样:

$this->form_validation->set_rules('email', 'Email', 'required|valid_email|callback_email_exists');

email_exists方法中,使用给定的电子邮件id检查用户是否存在。

如果user存在,则创建一个邮件函数。在消息发送链接中重置密码。

$slug = md5($user->user_id . $user->email . date('Ymd'));
    $this->email->message('To reset your password please click the link below and follow the instructions:
'. site_url('forgotpassword/reset/'.$user->user_id .'/'. $slug) .'
If you did not request to reset your password then please just ignore this email and no changes will occur.
Note: This reset code will expire after '. date('j M Y') .'.');

发送邮件

当用户单击重置链接时,该方法将再次检查会话。如果会话存在,则重定向到主页,否则从url中获取第三和第四段。

$user_id = $this->uri->segment(3);
if(!$user_id) show_error('Invalid reset code.');
$hash = $this->uri->segment(4);
if(!$hash) show_error('Invalid reset code.');

从url获取用户id。再次从db值中生成$slug,并将其与url $slug进行比较。如果两者都匹配,则向用户提供密码和确认密码的重置字段。

如果两个密码匹配。更新密码

我不会尝试将电子邮件地址作为重置密码的get方法。你只需要发送一个散列键作为url并完成你的工作。这些哈希键将作为令牌数据进行验证,并在有限的时间内有效。就是这样。

最新更新