как проверить, что пользователь нажал на ссылку в письме, которое я ему отправил?

Это более сфокусированный вопрос, вызванный более ранняя публикация здесь. Мне нужно аутентифицировать адрес электронной почты пользователя, доказав, что у него/нее есть доступ к нему. Я скопировал ниже общую аутентификацию электронной почты, которую вы ожидаете увидеть при присоединении к форуму разработчика или группе пользователей. В процессе регистрации вы предоставляете свой адрес электронной почты, а затем получаете электронное письмо с просьбой нажать на что-то, чтобы подтвердить свой адрес электронной почты.

Мне нужно закодировать все, что угодно происходит, когда пользователь нажимает на ссылку в письме. Поэтому мой вопрос-как мне это сделать?

какие технологии задействованы? Кто-нибудь проводит меня по ступенькам? Я предпочитаю язык сценариев Java или Linux, такой как bash. Еще лучше, есть ли какое-либо программное обеспечение, разработанное для этой цели, которое я могу установить на своем сервере Linux и каким-то образом интегрировать его в свою базу данных? Как это делается на практике? Я не хочу изобретать что-то новое, если оно уже доступно.

To confirm your email address of: 

youremail@yourdomain.net 

please send a short reply to this address: 

users-sc.1496854427.ckdpbmhncdlkjadkajfpecc-mylist=yourdomain.net@listdomain.com 

Usually, this happens when you just hit the "reply" button. 
If this does not work, simply copy the address and paste it into 
the "To:" field of a new message. 

or click here: 
mailto:users-sc.1496854427.ckdpbmhncdlkjadkajfpecc-mylist=yourdomain.net@listdomain.com  

This confirmation serves two purposes. First, it verifies that I am able 
to get mail through to you. Second, it protects you in case someone 
forges a subscription request in your name. 

Some mail programs are broken and cannot handle long addresses. If you 
cannot reply to this request, instead send a message to 
<users-request@listdomain.com> and put the 
entire address listed above into the "Subject:" line. 

3 ответов


в вашей базе данных пользователей вам нужно иметь промежуточную таблицу пользователей (или в основной таблице пользователей добавьте столбец, указывающий, активен ли пользователь и по умолчанию индикатор "нет"). Когда пользователь впервые регистрируется, вы генерируете уникальный хэш-код из части информации пользователя, например, используйте md5 для первичного ключа пользователя и имени (или другого набора переменных пользователя, которые вы можете получить обратно путем дешифрования) . Сделайте этот хэш-код параметром строки запроса в ссылке, которую вы отправляете пользователю. Наконец, когда пользователь нажимает на ссылку, получает хэш-код из строки запроса, расшифровывает его и сопоставляет расшифрованные значения с пользовательской строкой в вашей базе данных. Если совпадение найдено, установите для индикатора "active" значение true и presto. Кроме того, если используется промежуточная таблица, переместите запись пользователя в таблицу "активные пользователи", в которой выполняется авторизация.


отвечая на уникальное письмо, чтобы проверить, что чья-то электронная почта имеет врожденный недостаток, ее можно подделать (если вы не проверяете заголовки и ip). Например, я посещаю ваш сайт для регистрации. Вы говорите мне отвечать на users-sc.1496854427.ckdpbmhncdlkjadkajfpecc-mylist=yourdomain.net@listdomain.com. Я использую mail() функция с помощью спам-бота для ответа. игра окончена. Цель побеждена.

вместо этого, вы можете отправить мне ссылку для подтверждения на мой номер регистра. Что-то вроде example.com/verify?userid=1&hash=67gk65fs6714fgsHguj

в таблице users:

id|username|status|onetimehash
--+--------+------+-------------------------
 1|testuser|    0 |67gk65fs6714fgsHguj

теперь, в вашем проверить вызов проверьте имя пользователя и хэш. Если они совпадают со значениями в вашей БД, вы можете безопасно проверить пользователя. Для генерации хэша вы можете взять значение md5 или sha1 имени пользователя, смешанное с некоторой солью, такой как временная метка или некоторое случайное число.

обновление Если вы идете с первым решением, я.e, захват ответа пользователя для проверки электронной почты, вам придется настроить свой собственный почтовый сервер. Fetchmail может помочь вам. Вам придется программно читать заголовки электронной почты и извлечь необходимую информацию из <to>,<from> or <subject> поля. Как userid=1496854427 и hash=ckdpbmhncdlkjadkajfpecc. Вы мая нужно регулярное выражение в этом процессе. Как только у вас есть эти значения, это довольно просто, проверьте их на значения базы данных.

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


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