Классический сервис: восстановление пароля. Классическое решение: создаем ссылку с уникальным токеном, отправляем письмо. Юзер переходит, мы находим токен в базе, разрешаем поменять пароль. Минусы: мы должны хранить токены вместе со всей обвязкой: база, ORM, репликации, и так далее.
Более элегантное решение:
function generateLink(email) {
let token = HMAC_SHA256(email + '|' + expirationUnixtime, secret);
let link = 'https://example.com/recover/?t=' + token;
link += '&email=' + email;
link += '&sex=' + expirationUnixtime;
return link;
}
function verify(token, email, expirationUnixtime) {
let correctToken = HMAC_SHA256(email + '|' + expirationUnixtime, secret);
if (correctToken == token) {
return true;
}
return false;
}
То есть в ссылку ты добавляешь все нужные данные, но подписанные. Когда юзер приходит по ссылке, он приносит с собой цифровую подпись, совпадение которой разрешает выполнить действия. (А чтобы ссылка не стала вечной, добавляем срок действия.)
В моем основном проекте так происходит регистрация пользователей. Посетитель вводит почту, ему отправляется ссылка, и я создаю пользователя лишь тогда, когда он переходит по ней.
Еще вариант использования: автологин из писем. Срок действия тут не нужен. В подпись важно добавить хеш пароля, чтобы старые ссылки прекратили работать, если пользователь его поменяет.
Точно таким же методом можно хранить ценные данные в куках, разгружая серверный сторадж и логику.