2016-04-06 4 views
3

Я создал систему сброса пароля в php/silex/twig, которая получает сообщение об ошибке сброса пароля с уникальным токеном. После того, как пользователь посетит страницу confirm-new-password, вам будет предложено ввести новый пароль и подтвердить этот пароль. Затем у меня есть функция confirm_new_password, которая проверяет, совпадают ли пароли, если они обновляют базу данных этого конкретного пользователя, а затем удаляют токен. Все это прекрасно работает, поскольку я вижу в базе данных изменения пароля.Сброс пароля, ошибка входа после обновления базы данных

Однако моя проблема заключается в том, что когда пользователь пытается войти в систему со своим новым паролем, я получаю сообщение об ошибке с моими флеш-сообщениями, говорящими, что детали ошибочны, когда это не так.

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

Первоначально я прочитал this, чтобы начать помогать создавать функции сброса, включая другие, чтобы помочь с генерированием случайного токена и одного временного URL-адреса с истечением срока действия.

Впоследствии я прочитал this, который помог мне понять, что мне нужно передавать скрытые входы, чтобы почтовые переменные могли обновляться в соответствии с тем, какой пользователь сбрасывает свой пароль. Но, похоже, не удалось передать вопрос о входе в систему после сброса пароля.

Вот моя функция для подтверждающего нового пароля-

public function confirm_new_password($password1,$password2,$email,$token){ 

if($password1 === $password2){ 
     $password1 = mysqli_real_escape_string($this->link,$password1); 
     $password1 = password_hash($password1,PASSWORD_BCRYPT); 
     $result = mysqli_query($this->link,"update user set password='{$password1}' where email='{$email}' "); 
     $result1 = mysqli_query($this->link,"update user set token='' where email = '{$email}' "); 
     return true; 
}else{ 
    return false; 
} 

} 

и вот шаблон прутика;

<form class="form-signin" action="/confirm-new-password" method="post"> 
<h2 class="form-heading">Confirm New Password</h2> 
<label for="inputNewPass1" class="sr-only">New Password</label> 
<input type="password" id="inputNewPass1" class="form-control" name="pass1" placeholder="New Password" required> 
<label for="inputNewPass2" class="sr-only">Re-Type New Password</label> 
<input type="password" id="inputNewPass2" class="form-control" name="pass2" placeholder="Re-type New Password" required> 
{% if test is defined %} 

    <input type="hidden" name="email" value="{{ test.email }}"> 
    <input type="hidden" name="token" value="{{ test.token }}"> 
{% endif %} 
<div class="spamCheck"> 
     <label for="inputPostcode" class=sr-only">Postcode</label> 
     <input type="text" id="inputPostcode" class="form-control" name="postcode" placeholder="Leave this field blank" /> 
</div> 
<button class="btn btn-lg btn-default btn-block" type="submit">Reset Password</button> 
</form> 

и здесь код пост-контроллера;

$app->post('/confirm-new-password', function(Request $request) use($app){ 
$password1 = $app['request']->get('password1'); 
$password2 = $app['request']->get('password2'); 
$email  = $app['request']->get('email'); 
$token  = $app['request']->get('token'); 

if($app['auth']->confirm_new_password($password1,$password2,$email,$token)){ 
    return $app->redirect('/login'); 
}else{ 
    return $app->redirect('/'); 
} 

}); 

Следует отметить, что логин работает отлично для других пользователей, он просто перестает работать, когда пароль сбрасывается. Ниже приведена функция входа в систему;

public function login($email, $password) { 
    $email = mysqli_real_escape_string($this->link, $email); 

    $result = mysqli_query($this->link, "select email, password,type from user where email = '{$email}'"); 

    $row = mysqli_fetch_assoc($result); 

    if(password_verify($password,$row['password'])){ 
      $user = array('email' => $row['email'], 'type' => $row['type']); 
      $this->session->set('user', $user); 
      return true; 
     } else { 
      return false; 
     } 

    } 

и здесь метод почтового контроллера для входа;

$app->post('/login', function(Request $request) use($app) { 
$email = $app['request']->get('email'); 
$password = $app['request']->get('password'); 
$postcode = $app['request']->get('postcode'); 
$post = array($email,$password,$postcode); 
$app['auth']->spamBotCheck($post); 
$app['auth']->honeyPotCheck($postcode); 

if ($app['auth']->login($email, $password)) { 
    $app['session']->getFlashBag()->add('success','Success! You are now logged in.'); 
    return $app->redirect('/'); 
} else { 
    $app['session']->getFlashBag()->add('error','Error! There was an error with your login details, please try again'); 
    return $app->redirect('/login'); 
} 
}); 

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

+0

Кроме приведенного ниже ответа; я вижу, что вы используете 'name =" pass1 "и' name = "pass2" ', но вы делаете' get ('password1') 'и' get ('password2') '. Этот комментарий может быть частичным ответом. –

+0

Ничего себе глупая ошибка, это решило это. – mp252

+0

Рад это услышать, и я разместил его как дополнительный/бесплатный ответ. –

ответ

2

Превращение моего комментария в дополнительный/бесплатный ответ.

Помимо другого ответа; я вижу, что вы используете name="pass1" и name="pass2", но вы делаете get('password1') и get('password2').

  • Они должны соответствовать.

Добавить error reporting в начало файла (ов), который поможет найти ошибки.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// Then the rest of your code 

Sidenote: Отображение ошибок не должно быть сделано только в постановке, и никогда производства.

+0

спасибо, будет включать отчет об ошибках с этого момента. – mp252

+0

@ mp252 Добро пожаловать, * приветствует * –

1
$password1 = mysqli_real_escape_string($this->link,$password1); 
$password1 = password_hash($password1,PASSWORD_BCRYPT); 

Я хотел бы изменить порядок этих строк.
Первый хэш - это избежать его.

Так как вы делаете это сейчас, вы избегаете пароля (mypass'w0rd), добавляя, например, некоторые обратные косые черты (mypass \ 'w0rd) к исходному паролю и после этого хешируют его.

+0

Duely отметил, изменились и на этот формат в моей функции регистрации. Однако по-прежнему возникает ошибка входа. – mp252

Смежные вопросы