我需要实现一个登录页面的忘记密码。首先,我验证电子邮件,然后生成一个字符串,然后发送一个带有密钥和电子邮件的链接到特定的邮件。
我知道如何重置,但发生了什么接收到该邮件的链接
$message= "<a href='".base_url()."user/reset_pass/$key/$email'>";
是我提供的链接
基本流程应该是这样的:
- 用户点击忘记密码
- 验证邮件或用户id是否存在
- 创建
key
- 更新数据库中用户行上的
key
和time
(需要2列) -
创建包含链接的电子邮件,但只有
KEY
,电子邮件地址是不必要的,可能会被嗅探,这可能被用来破坏这个过程。<a href='".base_url()."user/reset_pass/$key'>
用户点击他们收到的电子邮件的链接
- 运行用户控制器的reset_pass方法,并作为参数 传递密钥。
- 在Users表中查找 键
如果没有找到
- 把用户扔到某个地方,可能是一个黑客
如果找到但超过时间限制
- 生成另一封带有新密钥的电子邮件 更新
key
和time
如果发现并且时间在限制内
- 抛出用户重置密码视图
密码重置后
- 更新用户表集
key
和time
列为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并完成你的工作。这些哈希键将作为令牌数据进行验证,并在有限的时间内有效。就是这样。