مقدمة: لماذا نحتاج OAuth 2.0 و JWT في التطبيقات الحديثة؟
\nفي تطوير الويب الحديث، أصبح أمن البيانات وإدارة الوصول في المقدمة. كل يوم، يدخل ملايين المستخدمين إلى التطبيقات عبر Google أو Facebook أو الأنظمة المؤسسية دون نقل كلمات المرور الخاصة بهم مباشرة. وهنا يأتي دور بروتوكولات OAuth 2.0 وتقنية JWT (JSON Web Tokens).
\nOAuth 2.0 هو معيار صناعي لتفويض الوصول. يسمح للتطبيقات بالحصول على وصول محدود إلى موارد المستخدم دون الكشف عن بيانات اعتماده. JWT، بدوره، هو تنسيق رمز مضغوط ومكتفٍ ذاتيًا يحتوي على جميع المعلومات اللازمة للتحقق من الهوية والتفويض.
\nفي هذه المقالة، سنشرح عمليًا كيفية تطبيق OAuth 2.0 وتفويض JWT بلغة C# باستخدام ASP.NET Core. ستتعلم كيفية إعداد خادم التفويض، توليد الرموز، وحماية نقاط نهاية API الخاصة بك. جميع أمثلة الكود جاهزة للاستخدام في المشاريع الحقيقية.
\n\n1. إعداد خادم التفويض باستخدام IdentityServer4
\nلتطبيق OAuth 2.0، سنستخدم المكتبة الشهيرة IdentityServer4 - وهي إطار عمل لـ ASP.NET Core يطبق بروتوكولات OpenID Connect و OAuth 2.0. سنبدأ بإنشاء خادم تفويض بسيط.
\n\nالخطوة 1: تثبيت الحزم وإنشاء المشروع
\nأنشئ مشروع ASP.NET Core Web Application جديد (قالب فارغ) وقم بتثبيت حزم NuGet اللازمة:
\ndotnet add package IdentityServer4\ndotnet add package Microsoft.AspNetCore.Authentication.JwtBearer\n\nالخطوة 2: تكوين العملاء والموارد
\nحدد المستخدمين الاختباريين والعملاء والموارد المحمية. أنشئ فئة Config.cs:
public static class Config\n{\n public static IEnumerable<IdentityResource> IdentityResources =>\n new[] { new IdentityResources.OpenId(), new IdentityResources.Profile() };\n\n public static IEnumerable<ApiScope> ApiScopes =>\n new[] { new ApiScope("api1", "My API") };\n\n public static IEnumerable<Client> Clients =>\n new[]\n {\n new Client\n {\n ClientId = "client",\n AllowedGrantTypes = GrantTypes.ClientCredentials,\n ClientSecrets = { new Secret("secret".Sha256()) },\n AllowedScopes = { "api1" }\n }\n };\n}\n\nالخطوة 3: تسجيل الخدمات في Startup.cs
\nقم بتكوين IdentityServer في دالة ConfigureServices:
public void ConfigureServices(IServiceCollection services)\n{\n services.AddIdentityServer()\n .AddInMemoryIdentityResources(Config.IdentityResources)\n .AddInMemoryApiScopes(Config.ApiScopes)\n .AddInMemoryClients(Config.Clients)\n .AddTestUsers(TestUsers.Users);\n\n services.AddAuthentication()\n .AddJwtBearer("Bearer", options =>\n {\n options.Authority = "https://localhost:5001";\n options.TokenValidationParameters = new TokenValidationParameters\n {\n ValidateAudience = false\n };\n });\n}\nفي دالة Configure، أضف استدعاء app.UseIdentityServer().
2. تطبيق رموز JWT: التوليد والتحقق
\nيتكون رمز JWT من ثلاثة أجزاء: الرأس (header)، الحمولة (payload)، والتوقيع (signature). في .NET، يتم توليد والتحقق من JWT باستخدام الآليات المدمجة.
\n\nتوليد رمز JWT يدويًا
\nأحيانًا تحتاج إلى إنشاء رمز يدويًا، على سبيل المثال للاختبار. استخدم الكود التالي:
\nusing System.IdentityModel.Tokens.Jwt;\nusing Microsoft.IdentityModel.Tokens;\nusing System.Security.Claims;\nusing System.Text;\n\npublic string GenerateJwtToken(string userI