2016-12-24 13 views
1

Мне нужно создать систему проверки электронной почты и сброса пароля, и для этого мне нужен генератор токенов. Сначала я думал, что эти жетоны должны быть строго уникальными, но когда я проверяю хэш (токен) и электронную почту в базе данных, я не понимаю, почему я не должен просто использовать случайную строку с достаточной длиной без добавления uniqid() например (что также было бы совершенно очевидно).Действительно ли проверка подлинности учетной записи или идентификатор сброса пароля действительно уникальны?

Я прав с этим допущением?

+3

Да, они должны быть уникальными и использоваться только один раз. Если один и тот же пользователь идет и пытается использовать один и тот же ключ и не должен/не должен быть разрешен, то это может быть проблемой. –

+0

Плюс, если вы используете ключ AI/PK от db (что вам нужно), то использование уникального ключа вместе с AI/PK сделает его еще более уникальным «для пользователя». Кстати, я вернулся к вопросу, чтобы узнать, есть ли больше активности; был еще один комментарий, но он был удален. Единственное, что я видел больше, - это мой одобренный комментарий. Я думаю, что вместе с этим один довольно (должен) ответить на вопрос. Вы можете пинговать меня, если хотите, так как я теперь оставил вопрос навсегда. Наслаждайтесь Xmas, * cheers * –

ответ

1

На самом деле это не должно быть уникальным для этого пользователя.

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

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

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

С уникальным пользовательским/хэш-кодом мне нужно только проверить, что код для этого пользователя действителен. Для сравнения вы обычно найдете поиск массива, и даже поиск в хэш-таблице займет гораздо больше времени.

Например, если пользователь не инициировал сброс пароля, их внутренний пользователь может выглядеть так, как если бы они были. Обратите внимание, в этом примере мы разрешаем последний один запрос сброса пароля (не несколько):

User.getName() = "Bob" 
User.getUserName() = "Bob5412" 

User.resetPasswordRequestedTime() = null 
User.resetPasswordToken() = null 
or 
User.resetPasswordRequestedTime() = 1482628217 
User.resetPasswordToken() = "f7de43859d244439b101df4e02cc4e17" 

Теперь мне нужно только, чтобы проверить, если маркер был действителен для запрошенного пользователя. Больше не нужно беспокоиться о «уникальном глобальном уровне».

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

+0

Да, именно мои мысли. И функция истечения срока годности определенно будет реализована, так как это отличный способ уменьшить количество уязвимых токенов. –