Вопрос по email, authentication, java – как проверить, что пользователь щелкнул ссылку в письме, которое я ему отправил?

7

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

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

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

To confirm your email address of: 

[email protected] 

please send a short reply to this address: 

us[email protected]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:us[email protected]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 
<[email protected]> and put the 
entire address listed above into the "Subject:" line. 
Конечно, но как кодировать этот шаг:when they click a ... link и этот шаг:iterate through your user table..., То есть что именно происходит при нажатии на ссылку? Какой должна быть ссылка? Как это работает? Что находится на принимающей стороне, которая слушает, когда нажимают на ссылку? Примеры, ключевые слова и т. Д. ggkmath
Переменная $ _GET в php позволяет вам получить ввод данных, который находится в самом URL, то есть в следующем URL,site.com/script.php?param=valueвызов $ _GET ["param"] в файле script.php вернет "значение". Получив код подтверждения в этом стиле, вы можете использовать таблицу mysql для хранения информации о том, какой код подтверждения соответствует какому пользователю. Vulcan
Спасибо, я могу сделать все, кроме последнего предложения. Когда пользователь щелкает ссылку, этот код каким-то образом получается веб-сайтом, который он затем сообщает, скажем, методу Java или PHP, который позаботится об остальном? Можете ли вы описать этот процесс немного подробнее? ggkmath
Большинство конечных пользователей предпочитают щелкать ссылку для подтверждения, а не отправлять ответ по электронной почте. Чтобы проверить, нажали ли они ссылку, сгенерируйте регистрационный код специально для них, и когда они щелкают по ссылке php проверки электронной почты с кодом в качестве параметра get, выполните итерацию по вашей пользовательской таблице, чтобы найти таблицу с этим кодом, и измените флаг в этой таблице mysql, чтобы пометить этого пользователя как подтвержденного по электронной почте. Vulcan
Примером ссылки для проверки может бытьhttp://example.com/verify?c=b53kl23d0ko234r5kok32490kdjk2uise где этот конечный беспорядок чисел является сгенерированным кодом подтверждения для этого пользователя. Ваш сценарий, который отправляет подтверждающее электронное письмо, должен также создать этот код генерации и сохранить его в таблицу mysql, в которой могут быть поля для кода подтверждения, даты истечения срока действия (кода) и идентификатора пользователя. После перехода по этой ссылке сценарий verify / index.php должен выполнить итерацию по таблице, чтобы найти пользователя с этой проверкой, а затем установить флаг в вашей пользовательской таблице на значение true для подтвержденного. Vulcan

Ваш Ответ

3   ответа
3

подтверждающее, что чья-то электронная почта имеет присущий ей недостаток, может быть подделан (если вы не проверите заголовки и ip). Например, я захожу на ваш сайт для регистрации. Вы говорите мне, чтобы ответить наus[email protected]listdomain.com, Я используюmail() функция, использующая спам-бот для ответа. Игра окончена. Цель побеждена.

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

В таблице пользователей:

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

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

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

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

@ggkmath Я обновил этот ответ.
Спасибо, придурок, глупый вопрос: как именно ответ пользователя на электронное письмо возвращает его к логике среднего уровня (например, Java)? Это мой единственный вопрос. ggkmath
5

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

На сервере должна быть страница, посвященная обработке ссылок электронной почты, например,mysite.com/user-activation.aspx (или php, или jsp, или то, что вы используете). Когда на эту страницу приходит запрос, то есть когда пользователь нажимает на ссылку, просто выполните request.GetParameter (& quot; hashcode & quot;) [или любой другой параметр строки запроса, который вы установили как]. В ASP.NET вы должны использовать функцию: age.Request.QueryString [& quot; youQueryStringField & quot;]; В Java / JSP: String someName = request.getParameter (& quot; yourQueryStringField & quot;); и в PHP оператор выглядит так: $ _GET [& quot; yourQueryStringField & quot;])
Выбранный здесь ответ также актуален:stackoverflow.com/questions/4533290/…  так же как:stackoverflow.com/questions/1907482/… ggkmath
Спасибо, ваш ответ действительно помогает! Я думаю, что для Java ответ заключается в использовании Java-сервлетов. Ссылка, которую я предоставляю в электронном письме, просто вызывает сервлет. Например:servletworld.com/servlet-tutorials/simple-servlet-example.html ggkmath
when the user clicks on the link, get the hashcode from the query string - как это сделать (точно)? Мне жаль, если это очевидно, но это то, с чем я борюсь. ggkmath
А также:stackoverflow.com/questions/2267064/… ggkmath
2

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

Похожие вопросы