【问题标题】:Forgot password in codeigniter在codeigniter中忘记密码
【发布时间】:2015-10-29 10:44:43
【问题描述】:

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

我知道如何重置,但是收到了该邮件的链接

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

这是我提供的链接。

【问题讨论】:

  • 您可以使用konyukhov.com/soft/tank_auth 身份验证库的最佳解决方案。它将帮助您减少工作量。它具有注册、登录、重置和忘记密码功能。易于实施
  • 非常感谢大家

标签: php codeigniter forgot-password


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    基本流程应该是这样的:

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

      &lt;a href='".base_url()."user/reset_pass/$key'&gt;

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

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

    如果没有找到

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

    如果找到但超过时限

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

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

    • 向用户抛出重置密码视图

    密码重置后

    • 将用户表集keytime 列更新为NULL

    【讨论】:

    • 我使用 codeigniter 已经有一段时间了,但看起来不错。好吧,您可以在该方法中使用它,而不是作为该方法的参数。 If all else fails Read the Manual
    【解决方案3】:

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

    像这样:

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

    然后发送邮件。

    当用户点击重置链接时,该方法将再次检查会话。如果会话存在,则重定向到主页,否则从 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 进行比较。如果两者都匹配,则向用户提供带有密码的重置字段并确认密码。

    如果两个密码都匹配,请更新密码。

    【讨论】:

    • 函数 reset_pass($key,$email) {
    • $key=$this->uri->segment(3); $email=$this->uri->segment(4);
    • 我在redirect redirect(base_url()."user/pass_confirmation/".$encrypted_string.'/'.$email);它在存在电子邮件的情况下无法正常工作
    • 如果不使用 urlencode,您将无法在 url 中传递电子邮件。
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2013-06-10
    • 2019-07-13
    • 2019-07-08
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多