أفضل ممارسات مصادقة JWT: Refresh Tokens و RBAC و OAuth 2.0
تنفيذ مصادقة JWT آمنة مع تدوير refresh token و RBAC وتدفقات OAuth 2.0. أنماط إنتاجية من أنظمة الرعاية الصحية والحكومة.
مقدمة
المصادقة (من أنت؟) والتفويض (ما الذي يمكنك فعله؟) هما أساس أمان التطبيقات. الخطأ فيهما يعرض مستخدميك وبياناتك لمخاطر كبيرة.
بعد بناء أنظمة مصادقة لمنصات الرعاية الصحية التي تتعامل مع PHI وأنظمة حكومية ببيانات سرية وتطبيقات مالية، طورت نهجاً شاملاً يوازن بين الأمان وسهولة الاستخدام.
المصادقة: إثبات الهوية
أفضل ممارسات JWT
class TokenService { generateAccessToken(user: User, sessionId: string): string { return jwt.sign( { sub: user.id, email: user.email, roles: user.roles, sessionId, type: 'access', }, this.privateKey, { algorithm: 'RS256', expiresIn: '15m', // قصير العمر issuer: this.config.issuer, jwtid: crypto.randomUUID(), } ); } async verifyAccessToken(token: string): Promise<TokenPayload> { const payload = jwt.verify(token, this.publicKey); // التحقق من الإلغاء const isRevoked = await this.tokenBlacklist.isRevoked(payload.jti); if (isRevoked) { throw new TokenRevokedError(); } return payload; } }
إدارة الجلسات
class SessionManager { async createSession(user: User, deviceInfo: DeviceInfo): Promise<Session> { const sessionId = crypto.randomUUID(); // التحقق من النشاط المشبوه await this.checkForSuspiciousLogin(user, deviceInfo); const session = await this.sessionRepository.create({ id: sessionId, userId: user.id, deviceFingerprint: this.generateDeviceFingerprint(deviceInfo), }); // فرض الحد الأقصى للجلسات المتزامنة const activeSessions = await this.sessionRepository.countByUserId(user.id); if (activeSessions > this.maxConcurrentSessions) { await this.terminateOldestSession(user.id); } return session; } }
المصادقة متعددة العوامل
class MFAService { async enableTOTP(userId: string): Promise<TOTPSetup> { const secret = authenticator.generateSecret(); await this.mfaRepository.create({ userId, type: 'totp', secret: this.encrypt(secret), enabled: false, }); const user = await this.userRepository.findById(userId); return { secret, qrCodeUrl: authenticator.keyuri(user.email, 'YourApp', secret), }; } async verifyTOTP(userId: string, code: string): Promise<boolean> { const mfaConfig = await this.mfaRepository.findByUserId(userId, 'totp'); const secret = this.decrypt(mfaConfig.secret); return authenticator.verify({ token: code, secret, window: 1 }); } }
التفويض: التحكم في الوصول
التحكم في الوصول القائم على الأدوار (RBAC)
enum Permission { PATIENT_READ = 'patient:read', PATIENT_WRITE = 'patient:write', MEDICAL_RECORD_READ = 'medical_record:read', } const ROLES = { DOCTOR: { permissions: [Permission.PATIENT_READ, Permission.PATIENT_WRITE], }, NURSE: { permissions: [Permission.PATIENT_READ], }, }; class AuthorizationMiddleware { requirePermission(...permissions: Permission[]) { return async (req: Request, res: Response, next: NextFunction) => { const userPermissions = await this.getUserPermissions(req.user.id); const hasPermission = permissions.every(p => userPermissions.includes(p) ); if (!hasPermission) { return res.status(403).json({ error: 'ممنوع' }); } next(); }; } }
التحكم في الوصول القائم على السمات (ABAC)
للتحكم الدقيق في الوصول.
المزالق الأمنية الشائعة
1. تخزين التوكنات غير الآمن
// ❌ لا تخزن التوكنات في localStorage (عرضة لـ XSS) // ✅ استخدم ملفات تعريف الارتباط httpOnly لتوكنات التحديث res.cookie('refreshToken', refreshToken, { httpOnly: true, secure: true, sameSite: 'strict', });
2. غياب تحديد المعدل
const loginRateLimiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 5, message: 'محاولات تسجيل دخول كثيرة جداً', });
الخلاصة
المصادقة والتفويض الآمن يتطلبان:
- توكنات وصول قصيرة العمر مع تدوير توكن التحديث
- إدارة جلسات آمنة مع تتبع الأجهزة
- مصادقة متعددة العوامل للعمليات الحساسة
- تفويض دقيق (RBAC أو ABAC حسب الحاجة)
- تسجيل تدقيق شامل
- تحديد المعدل وحماية القوة الغاشمة
الأمان ليس ميزة - إنه عملية مستمرة لتحديد المخاطر والتخفيف منها.
مقالات ذات صلة
هندسة الأمانقراءة 20 دقيقة
قائمة فحص أمان API: Rate Limiting والتحقق من المدخلات وتكوين CORS
تأمين APIs مع rate limiting والتحقق من المدخلات وتكوين CORS. قائمة فحص مختبرة إنتاجياً تغطي المصادقة والتشفير ومعالجة الأخطاء.
هندسة الأمانقراءة 17 دقيقة
أمان إدارة الجلسات: إعدادات الكوكيز وتدوير التوكن وتسجيل الخروج
تنفيذ إدارة جلسات آمنة مع إعدادات كوكيز صحيحة وتدوير التوكن وتدفقات تسجيل الخروج. يغطي تثبيت الجلسة ومنع الاختطاف والتعامل متعدد الأجهزة.
هندسة الأمانقراءة 18 دقيقة
كيفية منع SQL Injection و XSS: دليل الوقاية الكامل مع الكود
منع هجمات SQL injection و NoSQL injection و XSS مع أنماط كود مُتحقق منها. يغطي الاستعلامات المعاملة وتعقيم المدخلات وتكوين CSP.
تكامل بوابات الدفعقراءة 32 دقيقة
تكامل Stripe مع React و Node.js: Payment Intents و Webhooks و 3D Secure
تكامل Stripe الإنتاجي مع Payment Intents و webhooks و 3D Secure. يغطي فواتير الاشتراكات ومعالجة الأخطاء وأنماط امتثال PCI.
تصميم الخلفيةقراءة 21 دقيقة
REST مقابل GraphQL مقابل gRPC: مقارنة API الكاملة (الأداء وحالات الاستخدام)
قارن REST و GraphQL و gRPC APIs مع معايير الأداء وحالات الاستخدام. تعلم أي نمط API يناسب مشروعك بناءً على خبرة إنتاجية حقيقية.