اعمل مصادقة ثنائية TOTP في Node.js بـ otplib خطوة بخطوة
مستوى المقال: متوسط (Intermediate).
محتاج تعرف أساسيات Node.js وإزاي بيشتغل تسجيل الدخول عندك. مش محتاج أي خلفية في التشفير؛ هنبني المفهوم من الصفر بمثال بسيط قبل ما نلمس الكود.
في آخر المقال هيكون عندك مصادقة ثنائية شغّالة فعلاً: المستخدم بيمسح رمز QR مرة واحدة، وبعدها كل تسجيل دخول بيطلب رقم من 6 خانات بيتغيّر كل 30 ثانية. الكود كله أقل من 40 سطر Node.js، وبصفر تكلفة رسائل SMS.
المشكلة باختصار
كلمة المرور لوحدها مش كفاية. لو تسرّبت قاعدة بيانات، أو المستخدم استعمل نفس الباسورد في موقع تاني اتخترق، الحساب بيبقى مكشوف. المصادقة الثنائية بتضيف عامل تاني: حاجة المستخدم بيملكها (موبايله)، مش بس حاجة بيعرفها (الباسورد).
الرقم اللي بيوضّح ليه ده مهم: مايكروسوفت نشرت إن تفعيل المصادقة متعددة العوامل بيوقف أكثر من 99.9% من محاولات اختراق الحسابات الآلية. ده مش رقم تسويقي، ده فرق بين حساب بيتسرق وحساب بيصمد.
إيه هو TOTP بمثال بسيط الأول
تخيّل إن عندك انت وصاحبك نفس كتاب الطبخ بالظبط، ومتفقين على قاعدة: كل نص ساعة تفتحوا الصفحة اللي رقمها يساوي الساعة الحالية، وتطبخوا الطبق اللي فيها. انتوا الاتنين في مكانين مختلفين، ومن غير ما تكلّموا بعض، هتطبخوا نفس الطبق في نفس اللحظة، لأن عندكم نفس الكتاب ونفس قاعدة الوقت. لو حد تالت سمع الطبق بتاع الساعة دي، مش هينفعه بعد نص ساعة لأن الطبق هيتغيّر.
دي بالظبط فكرة TOTP. السر المشترك (Shared Secret) هو كتاب الطبخ، والوقت هو الصفحة. الموبايل والسيرفر عندهم نفس السر، وكل واحد فيهم بيحسب نفس الرقم لوحده بناءً على الوقت الحالي، من غير ما يبعتوا السر لبعض في كل مرة.
علميًا: TOTP (Time-Based One-Time Password) معرّف في المواصفة RFC 6238، وهو امتداد لـ HOTP في RFC 4226. الحساب باختصار: بنحسب عدّاد زمني T = floor(unixtime / 30)، وبنعمل HMAC-SHA1(secret, T)، وناتج الـ 20 بايت بنعمل له "اقتطاع ديناميكي" (Dynamic Truncation) يطلّع رقم 31-bit، وبناخد منه mod 1,000,000 عشان نوصل لـ 6 خانات. الافتراض إن ساعة الموبايل وساعة السيرفر قريبين من بعض في حدود ثواني.
الأدوات والافتراضات
هنستخدم Node.js مع مكتبة otplib (تطبيق ناضج ومتوافق مع RFC 6238) ومكتبة qrcode لتوليد رمز الـ QR. التطبيق على جهة المستخدم بيكون Google Authenticator أو Authy أو 1Password — كلهم بيقروا نفس صيغة otpauth:// القياسية. الشرح مبني على فرضية إن عندك نظام تسجيل دخول شغّال أصلاً، وكل اللي ناقصك هو طبقة العامل التاني.