Как сбросить пароль с помощью PHP Codeigniter - PullRequest
0 голосов
/ 03 мая 2018

Я работаю в системе сброса пароля, при которой пользователь, забывший свой пароль, может запросить ссылку для сброса пароля, отправив свою электронную почту, использованную при регистрации. Я успешно создал письмо, оно отправило ссылку, и я проверяю ссылку, нажав на нее. Ссылка прошла и загрузила страницу сброса, но моя проблема заключается в том, как заставить систему распознавать пользователя, который щелкнул по нему, и получить все данные, включая имя, токен и электронную почту, с помощью которых система подтвердит, что пользователь является пользователем, который запросил ссылка.

Вот что я сделал до сих пор:

Контроллер

    public function preset(){
        $data['success']='';
        $data['error']='';
        include_once ('query/user_query.php');

        $this->form_validation->set_rules('email','Email','trim|required|valid_email');
         $this->form_validation->set_error_delimiters("<div class='alert alert-warning'><span type='button' class='close' data-dismiss='alert'>&times</span>","</div>");

    if($this->form_validation->run() == false){

        $this->load->view('passwordrecovery.php', $data);
    }
    else{
        $eMail = $this->input->post('email');
         $this->db->where("email = '$eMail'");
        $this->db->from("useraccount");
        $countResult = $this->db->count_all_results();


        if($countResult >=1){
           // $data['firstName'] = '';
          //  $data['lastName'] = '';
            $this->db->where("email = '$eMail'");
            $getUserData =$this->db->get("useraccount")->result();
             foreach($getUserData as $userD){

             $data['firstName'] = $userD->firstname;
             $data['lastName'] = $userD->lastname;
             }
            $sender_email = 'xxx@gmail.com';
            $user_password = 'xxxxxx';
            $token = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 50);
            $subject = 'Password Reset';
            $message = '';
            $message .= "<h2>You are receiving this message in response to your request for password reset</h2>"
                    . "<p>Follow this link to reset your password <a href='".site_url()."/authenticate/resetpassword/.$token' >Reset Password</a> </p>"
                    . "<p>If You did not make this request kindly ignore!</p>"
                    . "<P class='pj'><h2>Kind Regard: Votemate</h2></p>"
                    . "<style>"
                    . ".pj{"
                    . "color:green;"
                    . "}"
                    . "</style>"
                    . "";
            // Configure email library
 $config['protocol'] = 'smtp';
 $config['smtp_host'] = 'ssl://smtp.googlemail.com';
 $config['smtp_port'] = 465;
 $config['smtp_user'] = $sender_email;
 $config['smtp_pass'] = $user_password;
 $config['mailtype'] = 'html';

 // Load email library and passing configured values to email library
 $this->load->library('email', $config);
 //$this->email->set_newline("rn");
 $this->email->set_mailtype("html");

 // Sender email address
 $this->email->from($sender_email);
 // Receiver email address
 $this->email->to($eMail);
// Subject of email
$this->email->subject($subject);
// Message in email
$this->email->message($message);

if ($this->email->send()) {

$eMail = $this->input->post('email');
$ipadd = $this->input->ip_address();
$insert = array(
  'email' => $eMail,
    'ipaddress' => $ipadd,
    'token' => $token
 );

 $this->db->insert('passwordreset', $insert);
 $mail = $this->session->set_userdata('email');
 $data['success'] = 'Email Successfully Send !';
 $this->load->view('linksent.php', $data);
 } else {
 $data['error'] =  '<p class="error_msg">Invalid Gmail Account or Password ! 
  </p>';
 }
 $this->load->view('passwordrecovery.php', $data);
  }


        if($countResult <= 0){

            //user already registered

            $data['error'] = "<div class='alert alert-warning'> Invalid 
    email address<span type='button' class='close' data- 
    dismiss='alert'>&times</span></div>";

            $this->load->view('passwordrecovery.php',$data);

        }

        }


         }

View

     <div>
                <h1>Password Recovery</h1>
                <h3>Enter your email to receive the password reset link in 
       your Inbox</h3>
                <br/>

                <?php echo form_open('authenticate/preset');?>
                <?php echo $error;?>
                <div class="form-group">
                    <input type="text" name="email" required="required">

                </div>
                <div class="form-group">
                    <input type="submit" value="Send" class="btn-success 
      btn" >
                </div>
                <?php echo form_close()?>
     <br/><br/><br/>


            </div>

База данных: Ниже приведена база данных, в которой я храню информацию:

   CREATE TABLE `passwordreset` (
   `resetid` int(11) NOT NULL,
   `email` varchar(150) NOT NULL,
   `ipaddress` varchar(25) NOT NULL,
   `token` varchar(512) NOT NULL
  ) ENGINE

Мне нужна помощь, как узнать подробности (имя, адрес электронной почты, токен) пользователя, который щелкает ссылку в своем электронном письме и использует ее для проверки, а также для обновления своего пароля. Спасибо

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

передать пользовательскую электронную почту или токен в URL или в скрытом поле, когда пользователь нажимает на ссылку проверки и проверяет метод контроллера.

<a href="<?=site_url('user_verification?user_email=' . $user_email . '&user_code=' .  $user_code);?> Click To Verifiy Email </a>

user_verification controller

public function user_verification_get()
{
   $user_email = $this->input->get('user_email');
   $user_code = $this->input->get('user_code');

   $data=$this->admin_model->user_verification($user_email,$user_code);

   if($data)
    {
        $data['message'] = 'Success.';
    }
    else
    {
        $data['message'] = 'Not Valid User.';
    }
    $this->load->template('verify', $data);
}

Модель

public function user_verification($user_email,$user_code){

    $this->db->select('user_email');
    $this->db->where('user_email',$user_email);
    $this->db->where('user_code',$user_code);
    $query = $this->db->get('users');

    if($query->row_array() > 0)
    {
        $data['user_isactive'] = true;

        $this->db->where('user_email',$user_email);
        $this->db->update('users',$data);
        return $query->row_array();
    }
    return false;
}
0 голосов
/ 03 мая 2018

Вы должны создать таблицу базы данных для хранения токенов. Перед отправкой электронного письма Вы должны сгенерировать уникальный токен и добавить его в отдельную таблицу. Ссылка для сброса пароля должна содержать закодированный токен и идентификатор пользователя. После того, как ссылка для сброса пароля нажата, вы должны проверить закодированный токен и идентификатор пользователя в ссылке соответствует записи в базе данных? Если да, то покажите страницу смены пароля. Если нет, вы должны отобразить сообщение «Ссылка устарела» или что-то в этом роде.

Вот подсказка кода из моего проекта.

$act_code = md5(rand(0,1000).'uniquefrasehere');
$activate['UserID']  $USERID;
$activate['TokenNumber'] = $act_code;
$activate['UserEmail'] = $email;
$activate['TokenTime'] = time();
$str_tmp = $this->db->insert_string('forgetpasswordtoken', $activate);
$query_tmp = $this->db->query($str_tmp);

После того, как ссылка нажата, вы должны проверить, используя следующий код:

$record = $this->user_model->checkforgot($uid[0], base64_decode($uid[1]));
if($record == true){
    $data['uid'] = $uid[1];
}
else
{
    $msg = "You have already changed your password or your link was expired.!";
}

А что делает функция checkforgotpassword? Вот ниже:

function checkforgot($token, $id)
{
    $qry = $this->db->query("SELECT * FROM forgetpasswordtoken WHERE TokenNumber = '".$token."' AND UserID = $id");
    $num_row = $qry->num_rows();
    if($num_row!=0)
    {
        $del = $this->db->delete('forgetpasswordtoken', array('TokenNumber' => $token, 'UserID' => $id)); 
        return true;
    }
    else
    {
        return false;
    }
}

Вы можете дополнительно добавить ограничение в несколько часов до истечения срока действия ссылки. Дайте мне знать после добавления этого в ваш проект.

Спасибо

...