Я создал систему сброса пароля в 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');
}
});
Я получаю ошибку вспышки, говоря, что произошла ошибка с моей регистрационные данные
Кроме приведенного ниже ответа; я вижу, что вы используете 'name =" pass1 "и' name = "pass2" ', но вы делаете' get ('password1') 'и' get ('password2') '. Этот комментарий может быть частичным ответом. –
Ничего себе глупая ошибка, это решило это. – mp252
Рад это услышать, и я разместил его как дополнительный/бесплатный ответ. –