[英]Resetting password, login error after database update
我在php / silex / twig中構建了一個密碼重置系統,它可以向用戶發送一個帶有唯一令牌的密碼重置鏈接。 用戶訪問confirm-new-password
頁面后,系統會提示您輸入新密碼並確認該密碼。 然后,我有一個函數confirm_new_password
,用於檢查密碼是否相同,如果它們更新該特定用戶的數據庫,然后刪除該令牌。 這一切都正常,因為我可以在數據庫中看到密碼更改。
但是我的問題是,當用戶嘗試使用他們的新密碼登錄時,我的flash消息會出現錯誤,說明在不是這種情況時細節是錯誤的。
當我使用password_hash
函數時,我認為它可能與此有關但是我在輸入數據庫之前對新密碼進行哈希處理並且它使用我的login
功能中的password_verify
函數運行檢查。
最初我讀過這個以開始幫助構建重置功能,包括其他幫助生成隨機令牌和一次有效期限的URL。
之后我讀了這篇文章 ,這有助於我理解我需要傳遞隱藏的輸入,以便根據哪個用戶重置密碼來更新帖子變量。 但是在密碼重置后似乎無法通過登錄問題。
這是我的確認新密碼的功能
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');
}
});
我收到了Flash錯誤,說我的登錄詳細信息出錯了
將我的評論轉為額外/免費答案。
除了給出的其他答案; 我看到的方式是你使用name="pass1"
和name="pass2"
但你正在做get('password1')
和get('password2')
。
將錯誤報告添加到文件的頂部,這將有助於查找錯誤。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
旁注:顯示錯誤只能在分段中完成,而不能在生產中完成。
$password1 = mysqli_real_escape_string($this->link,$password1);
$password1 = password_hash($password1,PASSWORD_BCRYPT);
我會改變這行的順序。
首先哈希它 - 比逃避它。
因為您現在的方式是,通過向原始密碼添加例如一些反斜杠(mypass \\'w0rd)並在該哈希之后轉義密碼(mypass'w0rd)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.