在 codeigniter 中忘记密码

Forgot password in codeigniter

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

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

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

这是我提供的link。

我不会尝试提供电子邮件地址作为重置密码的获取方法。 您只需将散列键作为 url 发送即可完成您的工作。而这些散列键将作为令牌数据进行验证,在有限的时间内有效。而已 。

基本流程应该是这样的:

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

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

用户在他们收到的电子邮件上点击 link

  • 运行用户控制器 reset_pass 方法并将密钥作为参数传递
  • 在用户 table 中搜索密钥

如果没有找到

  • 将用户扔到某个地方,可能是 hack

如果找到但超过时限

  • 使用新密钥生成另一封电子邮件
  • 用新的 keytime
  • 更新用户 table

如果找到并且时间在限制范围内

  • 抛出用户重设密码查看

密码重置后

  • 更新用户 table 将 keytime 列设置为 NULL

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

像这样:

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

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

如果用户存在则创建邮件 function.In 消息发送 link 以重置密码。

$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') .'.');

并发送邮件。

当用户点击重置时 link 该方法将再次检查 session.if 会话是否存在 重定向到主页,否则从 url.[=16= 获取第三和第四段]

$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.again 中获取用户 ID 从 db 值中生成 $slug 并将其与 url $slug 进行比较。如果两者匹配,则为用户提供重置字段和密码确认密码。

如果两者都是密码match.Update密码。