দুটি PWA-এর মধ্যে সাইন করা টোকেন: কোনো ব্যাকএন্ড ছাড়াই HMAC-SHA256
আপনাকে এক PWA থেকে অন্যটিতে ইউজারের পরিচয় (user identity) পাস করতে হবে। উভয় অ্যাপই আলাদা Firebase প্রজেক্টে চলে। তাদের মধ্যে কোনো ডাটাবেস শেয়ার করা নেই। তাদের কোনো অথেন্টিকেশন শেয়ার করা নেই।
আপনি কোনো ব্যাকএন্ড কোড না লিখেই এটি সমাধান করতে পারেন। আপনার শুধু ব্রাউজারের Web Crypto API এবং একটি সাইন করা URL প্রয়োজন।
সমস্যাটি হলো: PanelControl নামক একটি ইন্টারনাল টুলকে Orders নামক অন্য একটি সাইট ওপেন করতে হবে। যখন একজন ইউজার একটি বাটনে ক্লিক করবেন, Orders সাইটটিকে জানতে হবে ইউজার কে। ইউজারকে দ্বিতীয়বার লগইন করতে হবে না।
এটি করার তিনটি উপায়:
- Shared Firebase: একটি শেয়ারড ডাটাবেস প্রয়োজন। এখানে এটি সম্ভব নয়।
- postMessage: একই ডোমেইন বা একটি পপআপ প্রয়োজন। এটি ম্যানেজ করা কঠিন।
- HMAC signed URL: একটি টোকেনসহ লিঙ্ক ব্যবহার করা। এটি নিখুঁতভাবে কাজ করে।
এটি যেভাবে কাজ করে: HMAC একটি সিক্রেট কী (secret key) ব্যবহার করে একটি সিগনেচার তৈরি করে। রিসিভার সেই একই কী ব্যবহার করে সিগনেচারটি যাচাই করে। যদি তারা মিলে যায়, তবে সেন্ডারকে বিশ্বস্ত হিসেবে গণ্য করা হয়।
কাজের ধাপসমূহ (Workflow):
- সেন্ডার সাইড (Sender side):
- ইউজার নেম এবং টাইমস্ট্যাম্প দিয়ে একটি পেলোড (payload) তৈরি করুন।
- HMAC-SHA256 ব্যবহার করে পেলোডটি সাইন করুন।
- একটি URL-এর শেষে সিগনেচার এবং পেলোড যুক্ত করুন।
- রিসিভার সাইড (Receiver side):
- URL থেকে টোকেনটি পড়ুন।
- পেলোড থেকে সিগনেচারটি আলাদা করুন।
- শেয়ারড সিক্রেট ব্যবহার করে সিগনেচারটি পুনরায় ক্যালকুলেট করুন।
- টোকেনটি এক্সপায়ার হয়েছে কিনা তা পরীক্ষা করুন (যেমন: ৫ মিনিট পর)।
- যদি বৈধ হয়, তবে অ্যাপে ইউজারের পরিচয় সেট করুন।
ইমপ্লিমেন্টেশন ডিটেইলস:
Web Crypto API সমস্ত আধুনিক ব্রাউজারের জন্য নেটিভ। এটি ArrayBuffer-এর সাথে কাজ করে এবং এর জন্য কোনো অতিরিক্ত লাইব্রেরি প্রয়োজন হয় না।
সবকিছু পরিষ্কার রাখার জন্য, রিসিভার স্ক্রিপ্টটি ডকুমেন্টের head-এ চলে। এটি টোকেন যাচাই করে, সময় পরীক্ষা করে এবং সাথে সাথে history.replaceState ব্যবহার করে URL-টি পরিষ্কার করে দেয়। এটি ব্রাউজার বার থেকে টোকেনটি সরিয়ে ফেলে যাতে এটি লুকিয়ে থাকে।
নিরাপত্তা সংক্রান্ত একটি নোট: সিক্রেট কী-টি ক্লায়েন্ট কোডেই থাকে। DevTools ব্যবহারকারী যে কেউ এটি দেখতে পারে। ইন্টারনাল বিজনেস টুলের ক্ষেত্রে এটি ঠিক আছে, যেখানে আপনি শুধুমাত্র নাম বা এই জাতীয় নন-সেনসিটিভ ডাটা পাস করছেন।
আপনি যদি সেনসিটিভ ডাটা নিয়ে কোনো পাবলিক অ্যাপ তৈরি করেন, তবে পরিবর্তে একটি সার্ভার-সাইড টোকেন ব্যবহার করুন। ইন্টারনাল টুলের জন্য, ক্লায়েন্ট-অনলি এই পদ্ধতিটি দ্রুত এবং কার্যকর।
কোনো অতিরিক্ত ইনফ্রাস্ট্রাকচার নয়। কোনো অতিরিক্ত ডাটাবেস নয়। শুধু নেটিভ ব্রাউজার টুলস।
Source: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod
