هندسة الأمان

أفضل ممارسات مصادقة JWT: Refresh Tokens و RBAC و OAuth 2.0

تنفيذ مصادقة JWT آمنة مع تدوير refresh token و RBAC وتدفقات OAuth 2.0. أنماط إنتاجية من أنظمة الرعاية الصحية والحكومة.

Khalid Aboubakr
23 دقيقة قراءة
AuthenticationAuthorizationJwtOauthRbacSecurityRefresh TokensOauth2

مقدمة

المصادقة (من أنت؟) والتفويض (ما الذي يمكنك فعله؟) هما أساس أمان التطبيقات. الخطأ فيهما يعرض مستخدميك وبياناتك لمخاطر كبيرة.

بعد بناء أنظمة مصادقة لمنصات الرعاية الصحية التي تتعامل مع 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: 'محاولات تسجيل دخول كثيرة جداً', });

الخلاصة

المصادقة والتفويض الآمن يتطلبان:

  1. توكنات وصول قصيرة العمر مع تدوير توكن التحديث
  2. إدارة جلسات آمنة مع تتبع الأجهزة
  3. مصادقة متعددة العوامل للعمليات الحساسة
  4. تفويض دقيق (RBAC أو ABAC حسب الحاجة)
  5. تسجيل تدقيق شامل
  6. تحديد المعدل وحماية القوة الغاشمة

الأمان ليس ميزة - إنه عملية مستمرة لتحديد المخاطر والتخفيف منها.

مقالات ذات صلة