我需要在登录页面上实现忘记密码。首先我验证电子邮件然后生成一个字符串,然后发送带有密钥和电子邮件的链接到特定邮件。
我知道如何重置但发生的事情会收到该邮件的链接
$message= "<a href='".base_url()."user/reset_pass/$key/$email'>";
这是我提供的链接
请提出建议
答案 0 :(得分:1)
我不会尝试将电子邮件地址作为重置密码的get方法。 您只需将散列密钥作为网址发送即可完成工作。并且这些散列密钥将验证为令牌数据,这将在有限的时间内激活。就是这样。
答案 1 :(得分:1)
基本流程应该是这样的:
key
key
和time
(此处需要2列)创建包含链接但仅包含KEY
电子邮件地址的电子邮件是不必要的,可能会被嗅探,可能会影响此过程。
<a href='".base_url()."user/reset_pass/$key'>
用户点击他们收到的电子邮件上的链接
如果没有找到
如果找到但超出时间限制
key
和time
如果找到并且时间在限制范围内
密码重置后
key
和time
列更新为NULL 答案 2 :(得分:1)
首先,当用户点击忘记密码时,您需要检查会话是否存在。 如果否,则设置您将从用户处获取的电子邮件的验证方法。
像这样:$this->form_validation->set_rules('email', 'Email', 'required|valid_email|callback_email_exists');
在email_exists
方法中,使用给定的电子邮件ID检查用户是否存在。
如果用户存在则创建邮件功能。在邮件发送链接中重置密码。
$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') .'.');
发送邮件。
当用户点击重置链接时,该方法将再次检查session.if会话存在重定向使用到主页,否则从网址获取第三和第四段。
$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
进行比较。如果两者匹配,则向用户提供带密码和确认密码的重置字段。
如果两个密码都匹配。请更新密码。