אימות דו-שלבי (2FA)
מימוש TOTP (סיסמה חד-פעמית מבוססת זמן) באמצעות ספריית OTPAuth.
ארכיטקטורה
- ספרייה:
otpauth(TOTP, SHA1, 6 ספרות, מחזור 30 שניות) - קודי גיבוי: 10 קודים, 8 תווים hex דרך
crypto.randomBytes(4) - אחסון: שדות במודל User —
twoFactorSecret,twoFactorEnabled,twoFactorBackupCodes
זרימת אימות
בקשת התחברות
├─ פרטים תקינים + 2FA מושבת → החזרת JWT tokens
└─ פרטים תקינים + 2FA מופעל → החזרת { requiresTwoFactor: true, tempUserId }
└─ הלקוח שולח קוד TOTP
├─ TOTP תקין → החזרת JWT tokens
└─ TOTP לא תקין → בדיקת קודי גיבוי
├─ קוד גיבוי תקין → צריכת הקוד, החזרת JWT tokens
└─ לא תקין → 401 Unauthorized
נקודות קצה
| Method | Endpoint | תיאור | אימות |
|---|---|---|---|
GET | /auth/2fa/setup | יצירת QR code URI + סוד | JWT |
POST | /auth/2fa/enable | הפעלת 2FA | JWT |
DELETE | /auth/2fa/disable | השבתת 2FA | JWT |
POST | /auth/2fa/verify | אימות TOTP בזמן התחברות | Temp token |
קודי גיבוי
- נוצרים עם
crypto.randomBytes(4).toString('hex')(8 תווים hex כל אחד) - נשמרים כמערך במסמך המשתמש
- נצרכים בשימוש — מוסרים מהמערך לאחר אימות מוצלח
- ניתן לחדש דרך
regenerateBackupCodes()
קריטי
- סודות TOTP נשמרים בבסיס הנתונים — יש להצפין ב-MongoDB encryption at rest
- קודי גיבוי הם חד-פעמיים ומוסרים מיד מהמערך