توکن امضا شده بین دو PWA: استفاده از HMAC-SHA256 بدون نیاز به بک‌اند

شما نیاز دارید هویت کاربر را از یک PWA به PWA دیگر منتقل کنید. هر دو اپلیکیشن روی پروژه‌های مجزای Firebase اجرا می‌شوند. آن‌ها هیچ پایگاه داده یا سیستم احراز هویتی مشترک ندارند.

شما می‌توانید این مشکل را بدون نوشتن کد بک‌اند حل کنید. تنها به Web Crypto API مرورگر و یک URL امضا شده نیاز دارید.

مسئله: یک ابزار داخلی به نام PanelControl نیاز دارد تا سایت دیگری به نام Orders را باز کند. وقتی کاربر روی یک دکمه کلیک می‌کند، سایت Orders باید بداند کاربر کیست. کاربران نباید برای بار دوم نیاز به ورود (login) داشته باشند.

سه راه برای انجام این کار:

  • Firebase مشترک: نیاز به پایگاه داده مشترک دارد. در اینجا امکان‌پذیر نیست.
  • postMessage: نیاز به دامنه یکسان یا یک پاپ‌آپ دارد. مدیریت آن دشوارتر است.
  • URL امضا شده با HMAC: استفاده از یک لینک همراه با توکن. این روش عالی عمل می‌کند.

نحوه عملکرد: HMAC با استفاده از یک کلید مخفی (secret key)، یک امضا ایجاد می‌کند. گیرنده از همان کلید برای بررسی امضا استفاده می‌کند. اگر امضاها مطابقت داشته باشند، فرستنده قابل اعتماد است.

گردش کار:

  1. سمت فرستنده:
  • ایجاد یک payload شامل نام کاربر و برچسب زمانی (timestamp).
  • امضا کردن payload با استفاده از HMAC-SHA256.
  • اضافه کردن امضا و payload به یک URL.
  1. سمت گیرنده:
  • خواندن توکن از URL.
  • جدا کردن امضا از payload.
  • محاسبه مجدد امضا با استفاده از کلید مخفی مشترک.
  • بررسی انقضای توکن (مثلاً پس از ۵ دقیقه).
  • اگر معتبر بود، هویت کاربر را در اپلیکیشن تنظیم کنید.

جزئیات پیاده‌سازی: Web Crypto API در تمام مرورگرهای مدرن به صورت بومی (native) وجود دارد. این API با ArrayBuffer کار می‌کند و به هیچ کتابخانه اضافی نیاز ندارد.

برای تمیز نگه داشتن محیط، اسکریپت گیرنده در بخش head سند اجرا می‌شود. این اسکریپت توکن را تأیید، زمان را بررسی و بلافاصله با استفاده از history.replaceState URL را پاکسازی می‌کند. این کار باعث می‌شود توکن از نوار آدرس مرورگر حذف شده و مخفی بماند.

نکته‌ای در مورد امنیت: کلید مخفی در کد کلاینت قرار دارد. هر کسی که از DevTools استفاده کند می‌تواند آن را ببیند. این موضوع برای ابزارهای تجاری داخلی که در آن‌ها فقط داده‌های غیرحساس مانند نام منتقل می‌شود، مشکلی ندارد.

اگر در حال ساخت یک اپلیکیشن عمومی با داده‌های حساس هستید، به جای این روش از توکن سمت سرور استفاده کنید. برای ابزارهای داخلی، این روشِ صرفاً کلاینتی، سریع و مؤثر است.

بدون نیاز به زیرساخت اضافی. بدون نیاز به پایگاه داده اضافی. فقط با ابزارهای بومی مرورگر.

منبع: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod