Подтвердить что ты не робот

Внедрение функций забытого пароля в Java

В настоящее время я реализую функцию забытого пароля в проекте Java. моя методология,

  • Пользователь нажимает ссылку на забытый пароль.
  • На странице забытого пароля система предложит пользователю ввести адрес электронной почты, который он зарегистрировал в системе.
  • В электронном письме, содержащем ссылку на reset, пароль отправляется на указанный адрес электронной почты на шаге выше.
  • Пользователь нажимает на ссылку и перенаправляется на страницу (reset пароль), где пользователь может ввести свой новый пароль.
  • В reset странице пароля поле "адрес электронной почты" заполняется автоматически и его нельзя изменить.
  • Затем пользователь вводит свой новый пароль и обновляется поле, связанное с адресом электронной почты в базе данных.

Хотя я ограничил поле email address на странице пароля reset от редактирования (поле только для чтения), любой может изменить URL-адрес в адресной строке браузера и изменить поле адреса электронной почты.

Как запретить каждому пользователю изменять адрес электронной почты на странице пароля reset?

4b9b3361

Ответ 1

Вы должны сохранить его в БД перед отправкой электронной почты с помощью токена:

  • Когда пользователь нажимает "отправить мне письмо с инструкциями reset", вы создаете одну запись в БД с этими полями: email, token, expirationdate
  • Пользователь получает электронную почту с помощью yourwwebsite.com/token и нажимает на нее.
  • С token в URL-адресе сервер может identify the user, проверить, не истекает ли запрос по истечении срока действия, поместить правильный адрес электронной почты в поле и запросить обновление пароля. Пользователь вводит новые пароли, и вам нужно предоставить токен (hidden field в форме) + пароли к серверу. Сервер не заботится о текстовом поле для электронной почты, потому что with the token, user is identified strongly
  • Затем сервер проверяет, действительно ли токен действителен с помощью expirationdate (снова), проверьте, есть ли password match, и если все в порядке, сохраните новый пароль! Сервер может отправить снова сообщение, чтобы сообщить пользователю, что пароль был изменен из-за запроса.

Это действительно безопасно. Пожалуйста, используйте короткое время для expirationdate для улучшения безопасности (например, 5 минут для меня верны) и используйте сильный токен (как GUID, см. Комментарии)

Ответ 2

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

Однако, как альтернатива, если вам не нужно ее реализовывать самостоятельно, я бы предложил использовать сервис, который делает это для вас, например Stormpath.

Если вы решите использовать Stormpath, код, который будет запускать функциональность, будет выглядеть так на Java (с SDK Stormpath Java):

Account account = application.sendPasswordResetEmail("[email protected]");

Ваш пользователь получит электронное письмо со ссылкой:

http://yoursite.com/path/to/reset/page?sptoken=$TOKEN

И затем, когда пользователь нажимает на ссылку, вы должны подтвердить и reset пароль следующим образом:

Account account = application.resetPassword("$TOKEN", "newPassword");

Подробности о том, как это работает, можно найти в документации password reset.

При таком подходе вам не нужно реализовывать и поддерживать функции для себя, если у вас есть возможность этого не делать.

Примечание: Stormpath присоединился к Okta.

Ответ 3

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

Вы можете указать uniq random string or token ссылку reset и проверьте адрес электронной почты и комбинацию токенов после нажатия на ссылку reset password или после отправки пользователем запроса для пароля reset, проверив адрес электронной почты и строку токена в запросе с адресом электронной почты и токенной строкой в ​​вашей базе данных.

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

ПРИМЕЧАНИЕ.
Если вы используете какую-либо фреймворк или просто сервлет, чем лучше предоставить ссылку, чтобы вы могли проверить электронную почту и токенную строку перед отображением формы пароля reset. Если строка токена или адрес электронной почты недействительны, вы можете ограничить пользователя от запроса на отправку пароля reset и проверить после отправки запроса. Он будет более безопасным, чем проверка после отправки запроса пароля reset.

Ответ 4

Существует два общих решения:

1. Creating a new password on the server and inform user from it.
2. Sending a unique URL to reset password.

Первое решение имеет много проблем и не подходит для использования. Эти есть некоторые причины:

1. The new password which is created by server should be sent through an insecure channel (such as email, sms, ...) and resides in your inbox. 

2. If somebody know the email address or phone number of a user who has an account at a website then then it is possible to reset user password.

Итак, второе решение лучше использовать. Однако вы должны учитывать следующие проблемы:

- The reset url should be random, not something guessable and unique to this specific instance of the reset process.

- It should not consist of any external information to the user For example, a reset URL should not simply be a path such as ".../?username=Michael". 

- We need to ensure that the URL is loaded over HTTPS. No, posting to HTTPS is not enough, that URL with the token must implement transport layer 
  security so that the new password form cannot be MITM’d and the password the user creates is sent back over a secure connection.

- The other thing we want to do with a reset URL is setting token expiration time so that the reset process must be completed within a certain duration.

- The reset process must run once completely. So, Reset URL can not be appilicable if the reset process is done completely once.

Общее решение может генерировать URL-адрес для создания уникального токена, который может быть отправлен как параметр URL-адреса, он содержит URL-адрес, такой как "Reset/? ID = 2ae755640s15cd3si8c8i6s2cib9e14a1ae552b".

Ответ 5

Этот вопрос был опубликован за 3 года до этого ответа... Тем не менее, я думаю, что это может быть полезно для других.

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

Мне меньше нравится идея временно хранить вещи - это DB (как предполагает принятый ответ).

Идея, о которой я думал, заключалась в том, чтобы подписать данные в ссылке, которая была отправлена ​​пользователю. Затем, когда пользователь нажимает на ссылку и сервер принимает вызов, сервер также получает зашифрованную часть и может проверить, что данные были нетронутыми.

Кстати (здесь идет "продвижение" ): Я реализовал проект JAVA для этих случаев использования (также "создать учетную запись", "сменить пароль" и т.д.). Он бесплатный на GitHub, с открытым исходным кодом. Он отлично отвечает на ваш вопрос... реализован на Java, поверх Spring Безопасность.

Есть объяснения для всего (и если что-то отсутствует - дайте мне знать...)

Посмотрите: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows

Смотрите Демо здесь.

Существует также клиентское веб-приложение, использующее auth-потоки, с README со всеми пояснениями: https://github.com/OhadR/Authentication-Flows p >