المصادقة والتفويض في Go (Golang): JWT وOAuth2 والجلسات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

المصادقة والتفويض في Go (Golang)



تبدأ أمان تطبيقات الويب في Go بالتنفيذ الصحيح لآليات المصادقة (التحقق من "من أنت") والتفويض (التحقق من "ما يمكنك فعله"). في هذه المقالة، سنستعرض ثلاثة أساليب رئيسية: JWT (JSON Web Tokens)، OAuth2، والمصادقة القائمة على الجلسات. لكل منها حالات استخدامه ومزاياه وعيوبه.



1. المصادقة باستخدام JWT (JSON Web Token)



JWT هي طريقة مضغوطة ومكتفية ذاتياً لنقل المعلومات بين الأطراف في شكل كائن JSON. في Go، المكتبة الأكثر استخداماً للعمل مع JWT هي github.com/golang-jwt/jwt/v5.



التثبيت:

go get github.com/golang-jwt/jwt/v5


مثال لإنشاء والتحقق من JWT:

package main

import (\t"fmt"\t"time"\t"github.com/golang-jwt/jwt/v5")

var jwtSecret = []byte("my_secret_key")

// إنشاء الرمزfunc createToken(userID string) (string, error) {\tclaims := jwt.MapClaims{\t\t"user_id": userID,\t\t"exp": time.Now().Add(24 * time.Hour).Unix(),\t}\ttoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\treturn token.SignedString(jwtSecret)}

// التحقق من الرمزfunc validateToken(tokenString string) (string, error) {\ttoken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\t\tif _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\t\t\treturn nil, fmt.Errorf("طريقة توقيع غير صالحة")\t\t}\t\treturn jwtSecret, nil\t})

\tif err != nil {\t\treturn "", err\t}

\tif claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {\t\treturn claims["user_id"].(string), nil\t}\treturn "", fmt.Errorf("رمز غير صالح")}

func main() {\ttoken, _ := createToken("user123")\tfmt.Println("الرمز:", token)

\tuserID, err := validateToken(token)\tif err != nil {\t\tfmt.Println("خطأ:", err)\t} else {\t\tfmt.Println("المستخدم:", userID)\t}}


2. المصادقة عبر OAuth2



OAuth2 هو بروتوكول وصول مفوض يسمح للمستخدمين بتسجيل الدخول عبر خدمات خارجية (Google، GitHub، VK وغيرها). في Go، المكتبة الشائعة هي golang.org/x/oauth2.



التثبيت:

go get golang.org/x/oauth2


مثال OAuth2 مع Google:

package main

import (\t"context"\t"encoding/json"\t"fmt"\t"net/http"\t"golang.org/x/oauth2"\t"golang.org/x/oauth2/google")

var googleOauthConfig = &oauth2.Config{\tRedirectURL: "http://localhost:8080/callback",\tClientID: "your-client-id",\tClientSecret: "your-client-secret",\tScopes: []string{"https://www.googleapis.com/auth/userinfo.email"},\tEndpoint: google.Endpoint,}

func handleGoogleLogin(w http.ResponseWriter, r *http.Request) {\turl := googleOauthConfig.AuthCodeURL("state-token")\thttp.Redirect(w, r, url, http.StatusTemporaryRedirect)}

func handleCallback(w http.ResponseWriter, r *http.Request) {\tcode := r.URL.Query().Get("code")\ttoken, err := googleOauthConfig.Exchange(context.Background(), code)\tif err != nil {\t\thttp.Error(w, "خطأ في تبادل الرمز", http.StatusInternalServerError)\t\treturn\t}

\t// الحصول على بيانات المستخدم\tclient := googleOauthConfig.Client(context.Background(), token)\tresp, _ := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")\tdefer resp.Body.Close()

\tvar userInfo map[string]interface{}\tjson.NewDecoder(resp.Body).Decode(&userInfo)\tfmt.Fprintf(w, "البريد الإلكتروني: %v", userInfo["email"])}

func main() {\thttp.HandleFunc("/auth/google", handleGoogleLogin)\thttp.HandleFunc("/callback", handleCallback)\thttp.ListenAndServe(":8080", nil)}


3. المصادقة القائمة على الجلسات



النهج التقليدي باستخدام الكوكيز والجلسات من جانب الخادم. في Go، غالباً ما يستخدم

توصيات