التفويض والمصادقة في TypeScript: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التفويض والمصادقة في TypeScript: من النظرية إلى التطبيق



عند تطوير تطبيقات الويب الحديثة باستخدام TypeScript، تعتبر أمان بيانات المستخدم أولوية قصوى. عمليتان رئيسيتان — المصادقة (التحقق من الهوية) والتفويض (التحقق من صلاحيات الوصول) — تشكلان أساس أي نظام محمي. في هذا الدليل، سنشرح الدورة الكاملة لتنفيذ المصادقة والتفويض في TypeScript باستخدام المكتبات الشائعة وأفضل الممارسات.



1. المفاهيم الأساسية والاختلافات

  • المصادقة — عملية التحقق من أن المستخدم هو من يدّعي (تسجيل الدخول + كلمة المرور، القياسات الحيوية، OAuth).
  • التفويض — عملية تحديد الموارد والإجراءات المسموح بها للمستخدم المُصادق عليه (الأدوار، صلاحيات الوصول).

مثال: أدخل المستخدم كلمة المرور الصحيحة (مصادقة)، لكنه ممنوع من حذف منشورات الآخرين (تفويض).



2. الأدوات والمكتبات اللازمة

للتطبيق، سنستخدم:

  • bcrypt — لتجزئة كلمات المرور
  • jsonwebtoken (JWT) — لإنشاء والتحقق من الرموز المميزة
  • express + @types/express — الجزء الخادم
  • zod — للتحقق من صحة البيانات المدخلة


3. تسجيل المستخدم (المصادقة)

عند التسجيل، لا تُخزّن كلمة المرور أبدًا بشكل نصي. نستخدم bcrypt لإنشاء التجزئة:



import bcrypt from 'bcrypt';import { z } from 'zod';

const registerSchema = z.object({ email: z.string().email(), password: z.string().min(8)});

async function registerUser(email: string, password: string) { const validated = registerSchema.parse({ email, password }); const saltRounds = 10; const hashedPassword = await bcrypt.hash(validated.password, saltRounds); // حفظ email + hashedPassword في قاعدة البيانات // await db.user.create({ data: { email, password: hashedPassword } }); return { success: true };}


4. تسجيل الدخول وإصدار JWT

بعد التحقق الناجح من كلمة المرور، ننشئ رمز الوصول:



import jwt from 'jsonwebtoken';

const JWT_SECRET = process.env.JWT_SECRET!; // مهم في ملف .env

async function loginUser(email: string, password: string) { // 1. البحث عن المستخدم في قاعدة البيانات باستخدام البريد الإلكتروني // const user = await db.user.findUnique({ where: { email } }); // if (!user) throw new Error('User not found'); // 2. مقارنة كلمة المرور const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) throw new Error('Invalid password'); // 3. إنشاء JWT const token = jwt.sign( { userId: user.id, role: user.role }, JWT_SECRET, { expiresIn: '1h' } ); return { token, user: { id: user.id, email: user.email } };}


5. Middleware للتحقق من JWT (المصادقة)

ننشئ middleware للتحقق من الرمز المميز في كل طلب محمي:



import { Request, Response, NextFunction } from 'express';

interface AuthRequest extends Request { user?: { userId: string; role: string };}

export function authMiddleware(req: AuthRequest, res: Response, next: NextFunction) { const authHeader = req.headers.authorization; if (!authHeader?.startsWith('Bearer ')) { return res.status(401).json({ error: 'No token provided' }); } const token = authHeader.split(' ')[1]; try { const decoded = jwt.verify(token, JWT_SECRET) as { userId: string; role: string }; req.user = decoded; next(); } catch (err) { return res.status(403).json({ error: 'Invalid or expired token' }); }}


6. التفويض بناءً على الأدوار (RBAC)

ننشئ midd

توصيات