مكتبة عميل OAuth للغة Go (Golang)
المكتبة golang.org/x/oauth2 هي الحزمة الرسمية للعمل مع بروتوكول OAuth 2.0 بلغة Go. توفر واجهة سهلة لمصادقة المستخدمين عبر خدمات الطرف الثالث (Google، GitHub، Facebook، VK وغيرها)، بالإضافة إلى إدارة رموز الوصول والتحديث.
هذه الأداة هي المعيار الفعلي لتنفيذ OAuth 2.0 في تطبيقات Go. يتم دعمها بنشاط من قبل فريق Go وتستخدم في آلاف المشاريع، بما في ذلك Kubernetes و Docker وغيرها الكثير.
الميزات الرئيسية
- دعم جميع منح OAuth 2.0 — رمز التفويض، بيانات اعتماد العميل، بيانات اعتماد مالك المورد، الضمني.
- إدارة تلقائية للرموز — الحصول على رموز الوصول/التحديث وتحديثها وتخزينها.
- دعم مدمج للموفريين المشهورين — Google، GitHub، Facebook، Microsoft، Slack وغيرهم.
- إعداد مرن لعميل HTTP — إدراج الرموز تلقائياً في رؤوس الطلبات.
- تخزين آمن للرموز — دعم التشفير والمخازن المخصصة.
- التكامل مع net/http — middleware بسيط لمعالجة الطلبات.
التثبيت
يتم التثبيت بالطريقة القياسية عبر go get:
go get golang.org/x/oauth2يوصى أيضاً بتثبيت الحزمة الخاصة بموفر معين، على سبيل المثال Google:
go get golang.org/x/oauth2/googleمثال أساسي للاستخدام
لننظر إلى مثال بسيط للمصادقة عبر Google OAuth 2.0:
package main
import ( "context" "fmt" "net/http" "golang.org/x/oauth2" "golang.org/x/oauth2/google")
func main() { // إعداد OAuth 2.0 config := &oauth2.Config{ ClientID: "معرف_العميل_الخاص_بك", ClientSecret: "سر_العميل_الخاص_بك", RedirectURL: "http://localhost:8080/callback", Scopes: []string{"https://www.googleapis.com/auth/userinfo.email"}, Endpoint: google.Endpoint, }
// إنشاء رابط التفويض authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) fmt.Println("انتقل إلى الرابط:", authURL)
// معالجة callback http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) { code := r.URL.Query().Get("code") token, err := config.Exchange(context.Background(), code) if err != nil { http.Error(w, "خطأ في تبادل الرمز", http.StatusInternalServerError) return } fmt.Fprintf(w, "رمز الوصول: %s", token.AccessToken) })
http.ListenAndServe(":8080", nil)}العمل مع الرموز
توفر المكتبة طرقاً مريحة للعمل مع الرموز:
// حفظ الرمزtoken := &oauth2.Token{ AccessToken: "access-token", TokenType: "Bearer", RefreshToken: "refresh-token", Expiry: time.Now().Add(1 * time.Hour),}
// إنشاء عميل HTTP مع إدراج الرمز تلقائياًclient := config.Client(context.Background(), token)
// تنفيذ طلب مع التفويضresp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")if err != nil { // معالجة الخطأ}defer resp.Body.Close()مخزن رموز مخصص
لتطبيقات الإنتاج، يوصى بتنفيذ مخزن خاص بك:
type TokenStorage interface { GetToken() (*oauth2.Token, error) SetToken(*oauth2.Token) error}
// مثال باستخدام ملفtype FileStorage struct { path string}
func (f *FileStorage) GetToken() (*oauth2.Token, error) { data, err := os.ReadFile(f.pat