مقدمة في OAuth 2.0 و JWT بلغة C#
\nتتطلب تطبيقات الويب الحديثة آليات أمان موثوقة. أصبح بروتوكولان رئيسيان — OAuth 2.0 و JWT (JSON Web Token) — المعيار الفعلي لتنفيذ التفويض والمصادقة. في هذه المقالة، سنشرح كيفية استخدام هذه التقنيات في بيئة C# (.NET).
\nOAuth 2.0 هو بروتوكول وصول مفوض يسمح للتطبيقات بالحصول على وصول محدود إلى موارد المستخدم دون نقل بيانات اعتماده. من ناحية أخرى، JWT هو تنسيق رمز مميز مضغوط ومكتفي بذاته يُستخدم غالبًا لنقل معلومات المصادقة بين العميل والخادم.
\nفي هذا الدليل، سننشئ واجهة برمجة تطبيقات ويب بسيطة على ASP.NET Core، تنفذ OAuth 2.0 باستخدام رموز JWT المميزة. ستتعلم كيفية إعداد إنشاء نقاط النهاية والتحقق منها وحمايتها.
\n\nما هو OAuth 2.0 و JWT؟
\nقبل الانتقال إلى الكود، دعنا نشرح المفاهيم الأساسية.
\nOAuth 2.0
\nيحدد OAuth 2.0 أربعة أدوار:
\n- \n
- مالك المورد (Resource Owner) — عادةً المستخدم. \n
- العميل (Client) — التطبيق الذي يريد الوصول. \n
- خادم التفويض (Authorization Server) — يصدر الرموز المميزة. \n
- خادم الموارد (Resource Server) — يوفر البيانات المحمية. \n
يتضمن التدفق الرئيسي منح رمز التفويض (Authorization Code Grant): إعادة توجيه المستخدم إلى خادم التفويض، والحصول على رمز، واستبدال الرمز برمز وصول.
\n\nJWT (JSON Web Token)
\nيتكون JWT من ثلاثة أجزاء مفصولة بنقاط:
\n- \n
- الرأس (Header) — نوع الرمز المميز وخوارزمية التوقيع (مثل HS256). \n
- الحمولة (Payload) — البيانات (المطالبات)، مثل معرف المستخدم والدور وتاريخ انتهاء الصلاحية. \n
- التوقيع (Signature) — توقيع تم إنشاؤه باستخدام مفتاح سري. \n
مثال على JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
إعداد مشروع ASP.NET Core
\nلننشئ مشروع واجهة برمجة تطبيقات ويب جديدًا مع دعم المصادقة.
\ndotnet new webapi -n OAuthJwtDemo\ncd OAuthJwtDemo\nسنضيف حزم NuGet اللازمة:
\ndotnet add package Microsoft.AspNetCore.Authentication.JwtBearer\ndotnet add package System.IdentityModel.Tokens.Jwt\n\nالتكوين في appsettings.json
\nأضف قسمًا لإعدادات JWT في ملف appsettings.json:
{\n "JwtSettings": {\n "SecretKey": "YOUR_SUPER_SECRET_KEY_AT_LEAST_32_CHARS",\n "Issuer": "OAuthJwtDemo",\n "Audience": "OAuthJwtDemoClient",\n "ExpirationMinutes": 60\n }\n}\nهام: في مشروع حقيقي، قم بتخزين المفتاح السري في User Secrets أو Azure Key Vault.
\n\nتنفيذ خدمة إنشاء JWT
\nلننشئ واجهة وتنفيذها للعمل مع الرموز المميزة.
\nالواجهة IJwtService
\npublic interface IJwtService\n{\n string GenerateToken(string userId, string role);\n ClaimsPrincipal ValidateToken(string token);\n}\n\nتنفيذ JwtService
\npublic class JwtService : IJwtService\n{\n private readonly JwtSettings _settings;\n\n public JwtService(IOptions<JwtSettings> settings)\n {\n _settings = settings.Value;\n }\n\n public string GenerateToken(string userId, string role)\n {\n var claims = new[]\n {\n new Claim(ClaimTypes.NameIdentifier, userId),\n new Claim(ClaimTypes.Role, role),\n new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())\n };\n\n var key = new Symmetric