مكتبة عميل OAuth لـ C# (.NET): تنفيذ التفويض الآمن
في تطوير الويب الحديث، أصبح التكامل مع الخدمات الخارجية (Google, GitHub, Facebook وغيرها) عبر بروتوكول OAuth 2.0 معيارًا واقعيًا. بالنسبة لمنصة .NET، توجد عدة حلول ناضجة، لكن من بين الأكثر مرونة وأداءً هي مكتبة عميل OAuth لـ C# (.NET)، المتاحة عبر حزمة NuGet OAuthClient.Net. توفر هذه المكتبة للمطورين مجموعة كاملة من الأدوات لتنفيذ تدفق رمز التفويض (Authorization Code Flow)، ومنح الضمني (Implicit Grant)، وتدفق بيانات اعتماد العميل (Client Credentials Flow).
الإمكانيات الرئيسية للمكتبة
- دعم جميع مزودي OAuth 2.0 المشهورين — Google, GitHub, Microsoft, Facebook, VK, Yandex والخوادم المخصصة.
- إدارة تلقائية للرموز — الحصول على Access Token و Refresh Token، والتحديث التلقائي عند انتهاء الصلاحية.
- حماية مدمجة ضد هجمات CSRF — توليد والتحقق من معلمات state.
- عمل غير متزامن — جميع الطرق تدعم async/await.
- تكوين مرن — الإعداد عبر الكود أو ملف JSON.
- قابلية التوسع — إمكانية إضافة مزودين مخصصين عبر الواجهات.
التثبيت والربط
يتم التثبيت عبر مدير حزم NuGet:
Install-Package OAuthClient.Net -Version 2.1.0أو عبر .NET CLI:
dotnet add package OAuthClient.Net --version 2.1.0بعد التثبيت، يجب استيراد مساحة الأسماء:
using OAuthClient;using OAuthClient.Models;using OAuthClient.Providers;مثال أساسي: التفويض عبر Google
لننظر إلى سيناريو بسيط — الحصول على بيانات المستخدم من Google بعد التفويض الناجح.
public async Task<UserInfo> AuthenticateWithGoogleAsync(){ // إعداد المزود var googleProvider = new GoogleOAuthProvider( clientId: "YOUR_GOOGLE_CLIENT_ID", clientSecret: "YOUR_GOOGLE_CLIENT_SECRET", redirectUri: "https://yourapp.com/oauth/callback" );
// إنشاء العميل var oauthClient = new OAuthClient(googleProvider);
// توليد عنوان URL لإعادة توجيه المستخدم string authUrl = oauthClient.GetAuthorizationUrl( scope: new[] { "openid", "profile", "email" }, state: Guid.NewGuid().ToString() );
// بعد عودة المستخدم إلى عنوان URL الخاص بـ callback: // استخراج الرمز من معلمة الاستعلام "code" string authorizationCode = HttpContext.Request.Query["code"];
// مبادلة الرمز بالرمز المميز var tokenResponse = await oauthClient.ExchangeCodeForTokenAsync(authorizationCode);
// الحصول على معلومات المستخدم var userInfo = await oauthClient.GetUserInfoAsync(tokenResponse.AccessToken);
return userInfo;}العمل مع Refresh Token
لجلسات طويلة الأمد، تدير المكتبة تلقائيًا تحديث الرموز. مثال على حفظ واستعادة الجلسة:
// حفظ Refresh Token بعد التفويض الأولstring refreshToken = tokenResponse.RefreshToken;// احفظه في قاعدة البيانات أو مخزن آمن
// استعادة الجلسة: الحصول على Access Token جديدvar newTokenResponse = await oauthClient.RefreshAccessTokenAsync(refreshToken);
// التحديث التلقائي (منطق مدمج)oauthClient.TokenRefreshed += (sender, args) =>{ // تسجيل أو حفظ Refresh Token الجديد Console.WriteLine($"Refresh Token الجديد: {args.NewRefreshToken}");};مزود OAuth مخصص
إذا كان من الضروري الاتصال بخدمة غير موجودة في قائمة المزودين المدمجين، تتيح المكتبة إنشاء مزود خاص:
public class CustomProvi