Подписанный токен между двумя PWA: HMAC-SHA256 без бэкенда
Вам нужно передать данные о пользователе из одного PWA в другое. Оба приложения работают в разных проектах Firebase. У них нет общей базы данных. У них нет общей аутентификации.
Эту задачу можно решить, не написав ни строчки бэкенд-кода. Вам понадобятся только браузерный Web Crypto API и подписанный URL.
Проблема:
Внутренний инструмент под названием PanelControl должен открывать другой сайт — Orders. Когда пользователь нажимает кнопку, сайт Orders должен знать, кто этот пользователь. При этом пользователям не нужно логиниться повторно.
Три способа сделать это:
- Shared Firebase: Требуется общая база данных. В данном случае невозможно.
- postMessage: Требуется один и тот же домен или всплывающее окно. Сложнее в управлении.
- HMAC signed URL: Использование ссылки с токеном. Этот вариант работает идеально.
Как это работает:
HMAC создает подпись, используя секретный ключ. Получатель использует тот же ключ для проверки подписи. Если они совпадают, отправителю можно доверять.
Рабочий процесс:
- Сторона отправителя:
- Создать полезную нагрузку (payload) с именем пользователя и временной меткой.
- Подписать полезную нагрузку с помощью HMAC-SHA256.
- Добавить подпись и полезную нагрузку к URL.
- Сторона получателя:
- Прочитать токен из 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
