Подписанный токен между двумя PWA: HMAC-SHA256 без бэкенда

Вам нужно передать данные о пользователе из одного PWA в другое. Оба приложения работают в разных проектах Firebase. У них нет общей базы данных. У них нет общей аутентификации.

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

Проблема:

Внутренний инструмент под названием PanelControl должен открывать другой сайт — Orders. Когда пользователь нажимает кнопку, сайт Orders должен знать, кто этот пользователь. При этом пользователям не нужно логиниться повторно.

Три способа сделать это:

  • Shared Firebase: Требуется общая база данных. В данном случае невозможно.
  • postMessage: Требуется один и тот же домен или всплывающее окно. Сложнее в управлении.
  • HMAC signed URL: Использование ссылки с токеном. Этот вариант работает идеально.

Как это работает:

HMAC создает подпись, используя секретный ключ. Получатель использует тот же ключ для проверки подписи. Если они совпадают, отправителю можно доверять.

Рабочий процесс:

  1. Сторона отправителя:
  • Создать полезную нагрузку (payload) с именем пользователя и временной меткой.
  • Подписать полезную нагрузку с помощью HMAC-SHA256.
  • Добавить подпись и полезную нагрузку к URL.
  1. Сторона получателя:
  • Прочитать токен из URL.
  • Отделить подпись от полезной нагрузки.
  • Пересчитать подпись, используя общий секретный ключ.
  • Проверить, не истек ли срок действия токена (например, через 5 минут).
  • Если токен валиден, установить данные пользователя в приложении.

Детали реализации:

Web Crypto API является нативным для всех современных браузеров. Он работает с ArrayBuffer и не требует дополнительных библиотек.

Чтобы всё выглядело чисто, скрипт получателя запускается в head документа. Он проверяет токен, проверяет время и сразу же очищает URL с помощью history.replaceState. Это удаляет токен из адресной строки браузера, чтобы он оставался скрытым.

Примечание по безопасности:

Секретный ключ находится в клиентском коде. Любой, кто использует DevTools, может его увидеть. Это допустимо для внутренних бизнес-инструментов, где вы передаете только нечувствительные данные, такие как имя.

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

Никакой лишней инфраструктуры. Никаких дополнительных баз данных. Только нативные инструменты браузера.

Источник: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod