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

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

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

ابدأ الدورة

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



في تطوير الويب الحديث، يُعتبر أمان التطبيق جانبًا بالغ الأهمية. TypeScript، كإضافة فوق JavaScript، يوفر أدوات قوية لإنشاء أنظمة تفويض ومصادقة مقيدة الكتابة وآمنة. في هذه المقالة، سنشرح المفاهيم الأساسية والمكتبات الشائعة ونكتب أمثلة عملية باستخدام TypeScript.



المفاهيم الأساسية



قبل الانتقال إلى الكود، من المهم التمييز بين المصطلحين:

  • المصادقة (Authentication) — التحقق من هوية المستخدم (من أنت؟). يتم ذلك عادةً عبر اسم المستخدم/كلمة المرور، الرموز المميزة أو القياسات الحيوية.
  • التفويض (Authorization) — تحديد صلاحيات الوصول (ما الذي يُسمح لك بفعله؟). على سبيل المثال، الوصول إلى لوحة الإدارة فقط لدور "admin".


المكتبات الشائعة لـ TypeScript

في نظام TypeScript/Node.js البيئي، توجد عدة حلول موثوقة:

  • Passport.js — المكتبة الأكثر شيوعًا لاستراتيجيات المصادقة (محلية، JWT، OAuth). لديها دعم ممتاز لـ TypeScript عبر الأنواع @types/passport.
  • jsonwebtoken — العمل مع JWT (JSON Web Tokens). مقيدة الكتابة بالكامل.
  • bcrypt — تجزئة كلمات المرور. تُستخدم مع مكتبات أخرى.
  • express-session — إدارة الجلسات على الخادم.


مثال 1: المصادقة الأساسية باستخدام JWT

لننظر في إنشاء نظام بسيط برموز وصول. قم بتثبيت التبعيات:

npm install express jsonwebtoken bcrypt @types/express @types/jsonwebtoken @types/bcrypt


لننشئ خادمًا مع التسجيل وتسجيل الدخول:

import express, { Request, Response } from 'express';import jwt from 'jsonwebtoken';import bcrypt from 'bcrypt';

const app = express();app.use(express.json());

const SECRET_KEY = 'your-secret-key';const users: { username: string; passwordHash: string }[] = [];

// التسجيلapp.post('/register', async (req: Request, res: Response) => { const { username, password } = req.body; const passwordHash = await bcrypt.hash(password, 10); users.push({ username, passwordHash }); res.status(201).json({ message: 'User created' });});

// تسجيل الدخولapp.post('/login', async (req: Request, res: Response) => { const { username, password } = req.body; const user = users.find(u => u.username === username); if (!user) return res.status(401).json({ error: 'Invalid credentials' });

const isValid = await bcrypt.compare(password, user.passwordHash); if (!isValid) return res.status(401).json({ error: 'Invalid credentials' });

const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' }); res.json({ token });});

// مسار محميapp.get('/protected', (req: Request, res: Response) => { const authHeader = req.headers.authorization; if (!authHeader) return res.status(401).json({ error: 'No token provided' });

const token = authHeader.split(' ')[1]; // Bearer token try { const decoded = jwt.verify(token, SECRET_KEY); res.json({ message: 'Access granted', user: decoded }); } catch { res.status(403).json({ error: 'Invalid token' }); }});

app.listen(3000, () => console.log('Server running on port 3000'));


مثال 2: Middleware للتفويض مع الأدوار

لنضف نموذج الأدوار. لننشئ middleware مقيدة الكتابة:

interface JwtPayload {  username: string;  role: 'user' | 'admin';}

// Middleware للتحقق من المصادقةfunction authenticate(req: Request, res: Response, next: Function) { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Unauthorized' });

try { const decoded = jwt.verify(token, SECRET_KEY) as JwtPayload; (req as any).user =

توصيات