دو PWAs کے درمیان سائن شدہ ٹوکن: بغیر بیک اینڈ کے HMAC-SHA256
آپ کو ایک PWA سے دوسرے PWA تک صارف کی شناخت (user identity) منتقل کرنے کی ضرورت ہے۔ دونوں ایپس الگ الگ Firebase پروجیکٹس پر چلتی ہیں۔ ان کا کوئی مشترکہ ڈیٹا بیس نہیں ہے۔ ان کا کوئی مشترکہ آتھنٹیکیشن (authentication) نہیں ہے۔
آپ اسے بیک اینڈ کوڈ لکھے بغیر حل کر سکتے ہیں۔ آپ کو صرف براؤزر کی Web Crypto API اور ایک سائن شدہ URL کی ضرورت ہے۔
مسئلہ: PanelControl نامی ایک انٹرنل ٹول کو Orders نامی دوسری سائٹ کھولنی ہے۔ جب صارف کسی بٹن پر کلک کرے، تو Orders سائٹ کو معلوم ہونا چاہیے کہ صارف کون ہے۔ صارفین کو دوسری بار لاگ ان کرنے کی ضرورت نہیں ہونی چاہیے۔
اسے کرنے کے تین طریقے:
- Shared Firebase: اس کے لیے مشترکہ ڈیٹا بیس کی ضرورت ہوتی ہے۔ یہاں یہ ممکن نہیں ہے۔
- postMessage: اس کے لیے ایک ہی ڈومین یا پاپ اپ (popup) کی ضرورت ہوتی ہے۔ اسے مینیج کرنا مشکل ہے۔
- HMAC signed URL: ٹوکن کے ساتھ ایک لنک استعمال کریں۔ یہ طریقہ بالکل درست کام کرتا ہے۔
یہ کیسے کام کرتا ہے: HMAC ایک سیکرٹ کی (secret key) کا استعمال کرتے ہوئے ایک سگنیچر (signature) تخلیق کرتا ہے۔ وصول کرنے والا سگنیچر کو چیک کرنے کے لیے اسی کی (key) کا استعمال کرتا ہے۔ اگر وہ میچ ہو جائیں، تو بھیجنے والے پر بھروسہ کیا جا سکتا ہے۔
ورک فلو (Workflow):
- بھیجنے والے کی طرف (Sender side):
- صارف کے نام اور ٹائم اسٹیمپ (timestamp) کے ساتھ ایک پے لوڈ (payload) بنائیں۔
- HMAC-SHA256 کا استعمال کرتے ہوئے پے لوڈ کو سائن کریں۔
- سگنیچر اور پے لوڈ کو URL کے ساتھ جوڑ دیں۔
- وصول کرنے والے کی طرف (Receiver side):
- URL سے ٹوکن پڑھیں۔
- پے لوڈ سے سگنیچر کو الگ کریں۔
- مشترکہ سیکرٹ (shared secret) کا استعمال کرتے ہوئے سگنیچر کو دوبارہ کیلکولیٹ کریں۔
- چیک کریں کہ آیا ٹوکن ایکسپائر (expire) ہو گیا ہے (مثلاً 5 منٹ کے بعد)۔
- اگر درست ہو، تو ایپ میں صارف کی شناخت سیٹ کریں۔
نفاذ کی تفصیلات (Implementation details): Web Crypto API تمام جدید براؤزرز میں نیٹیو (native) ہے۔ یہ ArrayBuffer کے ساتھ کام کرتی ہے اور اس کے لیے کسی اضافی لائبریری کی ضرورت نہیں ہوتی ہے۔
چیزوں کو صاف ستھرا رکھنے کے لیے، وصول کرنے والا اسکرپٹ ڈاکومنٹ کے ہیڈ (head) میں چلتا ہے۔ یہ ٹوکن کی تصدیق کرتا ہے، وقت چیک کرتا ہے، اور فوری طور پر history.replaceState کا استعمال کرتے ہوئے URL کو صاف کر دیتا ہے۔ یہ براؤزر بار سے ٹوکن کو ہٹا دیتا ہے تاکہ وہ چھپا رہے۔
سیکیورٹی کے بارے میں ایک نوٹ: سیکرٹ کی (secret key) کلائنٹ کوڈ میں ہوتی ہے۔ DevTools استعمال کرنے والا کوئی بھی اسے دیکھ سکتا ہے۔ یہ ان انٹرنل بزنس ٹولز کے لیے ٹھیک ہے جہاں آپ صرف غیر حساس ڈیٹا جیسے کہ نام منتقل کرتے ہیں۔
اگر آپ حساس ڈیٹا کے ساتھ کوئی عوامی (public) ایپ بناتے ہیں، تو اس کے بجائے سرور سائیڈ ٹوکن استعمال کریں۔ انٹرنل ٹولز کے لیے، یہ کلائنٹ-اونلی (client-only) طریقہ تیز اور مؤثر ہے۔
کوئی اضافی انفراسٹرکچر نہیں۔ کوئی اضافی ڈیٹا بیس نہیں۔ صرف نیٹیو براؤزر ٹولز۔
ماخذ: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod
