Сброс пароля Backend Функциональность

У меня возникли небольшие проблемы с концептуальным управлением сбрасыванием пароля, если пользователь забыл пароль. Я пытаюсь смоделировать свою систему после этого SO-ответа.

Вот моя текущая настройка:

  1. Пользователь нажимает ссылку на забытый пароль на странице
  2. На странице предлагается ввести свой адрес электронной почты
  3. Пользователь вводит адрес электронной почты и хиты «Отправить мне свою информацию»
  4. Когда пользователь нажимает «Отправить мою информацию», новая запись создается в моей таблице password_change_requests со случайным идентификатором, временем и именем пользователя.
  5. Я отправляю пользователю ссылку, которая находится в формате http://mysite.net/resetpassword.php?id=xxx&username=yyy
  6. Файл resetpassword.php GET указывает идентификатор и имя пользователя
  7. resetpassword.php проверяет строку в password_change_requests, у которой есть имя пользователя и время, которое еще не истекло.
  8. Если строка найдена, то убедитесь, что идентификатор получает совпадения с хэшированным идентификатором в этой строке.
  9. Если идентификатор проверен, echo html с формами и кнопками для ввода нового пароля
  10. Попробуйте отправить новый пароль на другой php-скрипт, который проверяет новый пароль и подтверждает новый пароль. verifyNewPassword.php

Мой дизайн должен быть каким-то образом испорчен, потому что я не могу понять, как отправить пользователя обратно на resetpassword.php, если пароли не совпадают с проверкойNewPassword.php. Я не могу просто дать им ссылку, чтобы переслать их обратно на resetpassword.php, потому что для этой ссылки также нужен идентификатор и имя пользователя из GET. Я попытался отправить данные GET из файла resetpassword.php, чтобы проверитьNewPassword.php, но я не могу понять это, поскольку html находится внутри эха. Вот сводка моего кода:

resetpassword.php:

 if ($tokenFound) { echo "<html> <body> <h1>Password Reset</h1> <form action='verifyNewPassword.php' method='post'> <input type='password' name='password' placeholder='New Password'><br> <input type='password' name='confirmpassword' placeholder='Confirm New Password'><br><br> <input type='submit' value='Reset Password'> </form> </body> </html>"; } else { //notify user token is expired or not found. try to reset password again echo "not a valid token"; } 

verifyNewPassword.php:

 if ($password != $confirmpassword) { print "Passwords don't match. Click <a href=\"resetpassword.php\">here</a> to try again.<br/>"; } else { echo "passes match"; } 

Любой способ, которым вы это пишете, вам понадобятся эти значения xxx и yyy в verifyNewPassword.php. Лучшее решение могло бы сэкономить их при скрытых вводах при передаче resetpassword.php, отправить их вместе с POSTED-значениями и еще раз подтвердить их проверкойNewPassword.php.

Если вы хотите избежать ссылки, вы можете отправить ответ 303 с заголовком Location установленным на http://mysite.net/resetpassword.php?id=xxx&username=yyy , с другим необязательным флагом, если вы хотите отобразить ошибку сообщение.

Я закончил тем, что передал значения id и username из resetpassword, чтобы проверить пароль следующим образом:

 if ($tokenFound) { echo '<html> <body> <h1>Password Reset</h1> <form action="verifyNewPassword.php" method="post"> <input type="password" name="password" placeholder="New Password"><br> <input type="password" name="confirmpassword" placeholder="Confirm New Password"><br><br> <input type="hidden" name="username" value="' . $username . '"> <input type="hidden" name="id" value="' . $id . '"> <input type="submit" value="Reset Password"> </form> </body> </html>'; } else { //notify user token is expired or not found. try to reset password again echo "not a valid token"; }