رمز مميز (Token) موقع بين تطبيقين PWA: استخدام HMAC-SHA256 بدون خادم خلفي (Backend)
تحتاج إلى تمرير هوية المستخدم من تطبيق PWA إلى آخر. يعمل كلا التطبيقين على مشاريع Firebase منفصلة، ولا يتشاركان أي قاعدة بيانات، ولا يتشاركان أي نظام مصادقة.
يمكنك حل هذه المشكلة دون كتابة أي كود في الخادم الخلفي (Backend). كل ما تحتاجه هو Web Crypto API الخاص بالمتصفح ورابط (URL) موقع.
المشكلة: تحتاج أداة داخلية تسمى PanelControl إلى فتح موقع آخر يسمى Orders. عندما ينقر المستخدم على زر ما، يجب أن يعرف موقع Orders من هو المستخدم، دون الحاجة إلى تسجيل الدخول مرة أخرى.
ثلاث طرق للقيام بذلك:
- Firebase مشترك: يتطلب قاعدة بيانات مشتركة. وهذا غير ممكن هنا.
- postMessage: يتطلب نفس النطاق (domain) أو نافذة منبثقة (popup). وهو أصعب في الإدارة.
- رابط (URL) موقع باستخدام HMAC: استخدام رابط يحتوي على رمز مميز (token). هذه الطريقة تعمل بشكل مثالي.
كيف تعمل هذه الطريقة: يقوم HMAC بإنشاء توقيع باستخدام مفتاح سري (secret key). ويستخدم الطرف المستلم نفس المفتاح للتحقق من التوقيع. إذا تطابقا، يتم الوثوق بالمرسل.
سير العمل:
- جانب المرسل:
- إنشاء حمولة (payload) تحتوي على اسم المستخدم والطابع الزمني (timestamp).
- توقيع الحمولة باستخدام HMAC-SHA256.
- إلحاق التوقيع والحمولة بالرابط (URL).
- جانب المستلم:
- قراءة الرمز المميز (token) من الرابط.
- فصل التوقيع عن الحمولة.
- إعادة حساب التوقيع باستخدام المفتاح السري المشترك.
- التحقق مما إذا كان الرمز قد انتهت صلاحيته (على سبيل المثال، بعد 5 دقائق).
- إذا كان صالحاً، يتم تعيين هوية المستخدم في التطبيق.
تفاصيل التنفيذ:
تعد Web Crypto API مدمجة في جميع المتصفحات الحديثة. وهي تعمل مع ArrayBuffer ولا تتطلب أي مكتبات إضافية.
للحفاظ على نظافة الرابط، يتم تشغيل نص المستلم (receiver script) في قسم head من المستند. حيث يقوم بالتحقق من الرمز، وفحص الوقت، ثم يقوم فوراً بتنظيف الرابط باستخدام history.replaceState. هذا الإجراء يزيل الرمز من شريط عنوان المتصفح ليبقى مخفياً.
ملاحظة حول الأمان: يعيش المفتاح السري في كود العميل (client code). يمكن لأي شخص يستخدم DevTools رؤيته. هذا الأمر مقبول للأدوات التجارية الداخلية حيث تقوم فقط بتمرير بيانات غير حساسة مثل الاسم.
إذا كنت تبني تطبيقاً عاماً يحتوي على بيانات حساسة، فاستخدم رمزاً من جهة الخادم (server-side token) بدلاً من ذلك. أما بالنسبة للأدوات الداخلية، فإن هذه الطريقة التي تعتمد على العميل فقط سريعة وفعالة.
لا حاجة لبنية تحتية إضافية. لا حاجة لقواعد بيانات إضافية. فقط أدوات المتصفح الأصلية.
المصدر: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod
