المصادقة الآمنة في TypeScript: دليل للمحترفين

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

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

ابدأ الدورة

بياناتك تحت المجهر: لماذا المصادقة في TypeScript ليست مزحة

\n\n

تخيل: لقد أنشأت تطبيقًا رائعًا باستخدام TypeScript. إنه سريع، الأنواع صارمة، والكود جميل. لكن هناك تفصيل صغير واحد - المصادقة. وهنا يبدأ الجزء المثير للاهتمام. خطأ واحد - وتتسرب بيانات المستخدمين كالماء من بين الأصابع. هل هذا مألوف؟

\n\n

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

\n\n

في هذه المقالة، سنشرح كيفية بناء مصادقة آمنة في تطبيقات TypeScript من الصفر. لا ماء - فقط أمثلة حقيقية، وأفضل الممارسات، وقليل من الفكاهة السوداء (لا مفر منها).

\n\n

JWT: حب من أول رمز مميز

\n\n

JSON Web Token (JWT) هو المعيار الفعلي للمصادقة في تطبيقات الويب الحديثة. ولكن، كما قال العم بن، "مع القوة العظيمة تأتي مسؤولية عظيمة". يمكن أن يكون JWT درعًا أو قنبلة موقوتة.

\n\n

كيف لا يجب أن تفعل: مثال مضاد

\n\n

الخطيئة الأكثر شيوعًا للمبتدئين هي تخزين الرمز المميز في localStorage ونقله بشكل مكشوف. نعم، هذا يعمل. لكنه مثل ترك مفاتيح الشقة تحت السجادة - يبدو مريحًا، لكن أي مار يمكنه الدخول. هجوم XSS - وكل رموزك المميزة في يد المهاجم.

\n\n

العمل الصحيح مع JWT في TypeScript

\n\n

دعنا نكتب غلافًا آمنًا للعمل مع الرموز المميزة. سيساعدنا TypeScript هنا في عدم الخلط بين الأنواع وعدم نسيان التحقق من الصحة.

\n\n
import jwt from 'jsonwebtoken';\n\ninterface TokenPayload {\n  userId: string;\n  role: 'user' | 'admin';\n  iat?: number;\n  exp?: number;\n}\n\n// إنشاء رمز مميز بكتابة واضحة\nfunction generateAccessToken(payload: TokenPayload): string {\n  return jwt.sign(\n    { ...payload },\n    process.env.JWT_SECRET as string,\n    { expiresIn: '15m' }\n  );\n}\n\n// التحقق والتحويل الفوري إلى الواجهة الخاصة بنا\nfunction verifyAccessToken(token: string): TokenPayload | null {\n  try {\n    return jwt.verify(\n      token, \n      process.env.JWT_SECRET as string\n    ) as TokenPayload;\n  } catch (error) {\n    console.error('الرمز المميز لم يجتاز التحقق:', error);\n    return null;\n  }\n}
\n\n

لاحظ: نحن دائمًا نتحقق من أن JWT_SECRET موجود وهو سلسلة نصية. TypeScript يجبرنا على فعل ذلك - لا undefined في وقت التشغيل!

\n\n

تجزئة كلمات المرور: bcrypt يسرع للمساعدة

\n\n

تخزين كلمات المرور بنص واضح هو جريمة. حتى لو كانت قاعدة بياناتك محمية بشكل أفضل من Fort Knox، اختراق واحد - وستكون في الأخبار كـ "تسريب كلمات مرور" آخر. تجزئة كلمات المرور هي طوق النجاة الخاص بك.

\n\n

لماذا bcrypt وليس MD5؟

\n\n

MD5 مات. SHA-256 - ليس خيارًا أيضًا. يمكن لوحدات معالجة الرسوم الحديثة (GPU) تجربة مليارات التجزئات في الثانية. Bcrypt تم إنشاؤه خصيصًا ليكون بطيئًا. إنه يستخدم الملح (بيانات عشوائية) وعامل تكلفة قابل للتعديل. كلما زادت التكلفة - زاد الوقت لحساب التجزئة. وهذا جيد!

\n\n

التنفيذ في TypeScript

\n\n
import bcrypt from 'bcrypt';\n\nconst SALT_ROUNDS = 12; // القيمة المثلى في عام 2024\n\nasync function hashPassword(password: string): Promise<string> {\n  const salt = await bcrypt.genSalt(SALT_ROUNDS);\n  return bcrypt.hash(password, salt);\n}\n\nasync function comparePassword(\n  password: string, \n  hash: string\n): Promise<boolean> {\n  return bcrypt.compare(password, hash);\n}\n\n// دالة مكتوبة للتسجيل\ninterface CreateUserInput {\n  email: string;\n  password: string;\n  name: string;\n}\n\nasync function createUser(input: CreateUserInput): Promise<Omit<User, 'passwordHash'>> {\n  const passwordHash = await hashPassword(input.password);\n  \n  // حفظ في قاعدة البيانات (هنا كود قاعدتك                

المدونات

توصيات الكتب