password_verify не работает должным образом, если данный хеш хранится в базе данных MySQL

0

Я делаю приложение на PHP с каркасом CodeIgniter.

Мне удалось создать страницу регистрации, которая позволяет пользователям вводить свой адрес электронной почты и пароль. Я использую password_hash(password, PASSWORD_DEFAULT) функцию PHP для хранения паролей пользователей в базе данных. Я убедился, что столбец имеет длину VARCHAR длиной 255.

В моей модели пользователя у меня есть следующие функции:
User_model:

public function insert_user($emailAddress, $password, $firstName, $lastName){
    $data = array(
        'email' => $emailAddress,
        'password' => password_hash($password, PASSWORD_DEFAULT),
        'firstName' => $firstName,
        'lastName' => $lastName
    );

    if(! $this->emailExists($emailAddress)){
        $this->db->insert('users', $data);
        return true;
    } else {
        return false;
    }
}

public function emailExists($emailAddress){
    $query = $this->db->get_where('users', array('email' => $emailAddress));
    if($query->num_rows() == 0){
        return false;
    }
    return true;
}

//Only use this function if you know that the email is already stored in db
public function getPassword($emailAddress){
    $query = $this->db->get_where('users', array('email' => $emailAddress));

    $row = $query->row();
    $password = $row->password;

    return $password;
}

Это мой контроллер для обработки логинов
Авторизоваться:

    class Login extends CI_Controller {

    public function index(){
        $this->load->helper(array('form', 'url'));
        $this->load->model('User_model');
        $this->load->library('form_validation');

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

        if ($this->form_validation->run() == FALSE){
            $this->load->view('login'); 
        } else {        
            $email = $this->input->post('email');
            $password = $this->input->post('password');

            if($this->User_model->emailExists($email)){
                $storedPassword = $this->User_model->getPassword($email);
                if(password_verify($password, $storedPassword)){
                    echo 'passwords match';
                } else {
                    echo 'passwords dont match';
                }
            } else {
                echo 'email doesnt exist';
            }
        }
    }
}

Соответствующее представление:
авторизоваться

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        <?php echo validation_errors(); ?>
        <?php echo form_open('Login'); ?>

        <h5>Email Address</h5>
        <input type="text" name="email" value="<?php echo set_value('email');?>" size="50" />

        <h5>Password</h5>
        <input type="text" name="password" value="<?php echo set_value('password');?>" size="50" />

        <div><input type="submit" value="Submit" /></div>
        </form>
    </body>
</html>

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

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

  • 0
    $storedPassword = $this->User_model->getPassword($email); - не должна ли переменная электронной почты быть здесь для пароля? Конечно, похоже на это для меня.
  • 1
    что он показывает вам, когда вы var_dump($storedPassword); ?
Показать ещё 3 комментария
Теги:
codeigniter
php-password-hash

1 ответ

0

Если $storedPassword же, как вы ожидаете, - хеш, который соответствует тому, который $storedPassword в поле пароля для пользователя, как определено их электронной почтой, - тогда это должно означать, что пароль, который пользователь предоставляет, не соответствует таковому в базе данных; так как это единственный логический вариант.

Я бы начал заново и создал нового пользователя с новым паролем и посмотрел, будет ли он работать после этого. Пожалуйста, имейте в виду, что поле password в базе данных должно быть равно или выше 255 символов (varchar (255)) (возможно, ваше поле недостаточно велико, поэтому только часть хеша хранится - объяснит вашу проблему).

Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором).

http://php.net/manual/en/function.password-hash.php

Ещё вопросы

Сообщество Overcoder
Наверх
Меню