#189

Передача подписанных данных через броузер

Классический сервис: восстановление пароля. Классическое решение: создаем ссылку с уникальным токеном, отправляем письмо. Юзер переходит, мы находим токен в базе, разрешаем поменять пароль. Минусы: мы должны хранить токены вместе со всей обвязкой: база, 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;
}

То есть в ссылку ты добавляешь все нужные данные, но подписанные. Когда юзер приходит по ссылке, он приносит с собой цифровую подпись, совпадение которой разрешает выполнить действия. (А чтобы ссылка не стала вечной, добавляем срок действия.)

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

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

Точно таким же методом можно хранить ценные данные в куках, разгружая серверный сторадж и логику.