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