عميل OAuth للغة Go (Golang): دمج المصادقة في تطبيقك
\n\nنادرًا ما تستغني تطبيقات الويب الحديثة عن المصادقة الخارجية. OAuth 2.0 هو بروتوكول قياسي يسمح للمستخدمين بتسجيل الدخول عبر حسابات Google وGitHub وVK وغيرها من الخدمات. في نظام Go (Golang)، توجد مكتبة قوية للعمل مع OAuth وهي golang.org/x/oauth2، والتي توفر عملاء جاهزين وأدوات مرنة لتكوين التفويض.
في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت وتكوين واستخدام عميل OAuth للغة Go، وسنقدم أمثلة عملية لمزودي الخدمة المشهورين.
\n\nما هو OAuth 2.0 ولماذا هو مطلوب؟
\n\nOAuth 2.0 هو بروتوكول وصول مفوض. بدلاً من تخزين كلمات مرور المستخدمين، يحصل تطبيقك على رمز مميز (token) مؤقت يسمح بالوصول إلى موارد معينة (مثل ملف تعريف المستخدم). المزايا الرئيسية:
\n\n- \n
- الأمان — لا يتم نقل كلمات المرور أو تخزينها في تطبيقك. \n
- الراحة — يسجل المستخدمون الدخول بنقرة واحدة من خلال الخدمات المألوفة لديهم. \n
- المرونة — يمكن طلب الأذونات الضرورية فقط (النطاق - scope). \n
تثبيت مكتبة OAuth للغة Go
\n\nمكتبة golang.org/x/oauth2 هي امتداد رسمي للغة Go. يتم التثبيت باستخدام الأمر القياسي:
go get golang.org/x/oauth2\ngo get golang.org/x/oauth2/google // لـ Google\ngo get golang.org/x/oauth2/github // لـ GitHub (إذا كان متاحًا)\n\n\nقد يكون من الضروري أيضًا تثبيت حزمة للعمل مع مزود خدمة معين (مثل google أو facebook). بالنسبة لمعظم الخدمات، تحتاج إلى كتابة نقطة نهاية (endpoint) خاصة بك، لكن الهيكل الأساسي هو نفسه.
الإعداد الأساسي لعميل OAuth
\n\nللبدء، يجب تسجيل تطبيق لدى مزود الخدمة (Google، GitHub، إلخ) والحصول على ClientID و ClientSecret. ثم يتم إنشاء تكوين OAuth2:
package main\n\nimport (\n "context"\n "fmt"\n "golang.org/x/oauth2"\n)\n\nfunc main() {\n // تكوين OAuth2 لـ Google\n conf := &oauth2.Config{\n ClientID: "معرف_العميل_الخاص_بك",\n ClientSecret: "سر_العميل_الخاص_بك",\n RedirectURL: "http://localhost:8080/callback",\n Scopes: []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"},\n Endpoint: oauth2.Endpoint{\n AuthURL: "https://accounts.google.com/o/oauth2/auth",\n TokenURL: "https://oauth2.googleapis.com/token",\n },\n }\n\n // إنشاء عنوان URL لإعادة توجيه المستخدم\n url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)\n fmt.Printf("انتقل إلى الرابط للتفويض: %v\\n", url)\n}\n\n\nلاحظ المعامل state — هذه سلسلة للحماية من هجمات CSRF. في التطبيق الحقيقي، يجب إنشاؤها عشوائيًا وتخزينها في الجلسة.
معالجة callback والحصول على الرمز المميز (token)
\n\nبعد أن يقوم المستخدم بالتفويض، يقوم مزود الخدمة بإعادة توجيهه إلى RedirectURL مع المعامل code. يتم استبدال هذا الكود بالرمز المميز للوصول. مثال على معالج بلغة Go:
package main\n\nimport (\n "context"\n "fmt"\n "net/http"\n "golang.org/x/oauth2"\n)\n\nvar oauthConfig *oauth2.Config\n\nfunc callbackHandler(w http.ResponseWriter, r *http.Request) {\n code := r.URL.Query().Get("code")\n if code == "" {\n http.Error(w, "لم يتم الحصول على الكود", http.StatusBadRequest)\n return\n }\n\n // استبدال الكود بالرمز المميز\n token, err := oauthConfig.Exchange(context.Background(), code)\n if err != nil {\n http.Error(w, "خطأ في استبدال الرمز المميز: "+err.Error(), http.StatusInternalServerError)\n return\n }\n\n