المصادقة والتفويض في Go: الحزم والأمثلة العملية

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

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

ابدأ الدورة

المصادقة والتفويض في Go (Golang): نظرة عامة على الأدوات الرئيسية



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



1. تجزئة كلمات المرور: golang.org/x/crypto/bcrypt

الخطوة الأولى لأي مصادقة هي التخزين الآمن لكلمات المرور. لا تقم أبدًا بتخزين كلمات المرور كنص صريح! توفر حزمة bcrypt من المجموعة القياسية لـ Go خوارزمية تجزئة مثبتة بتكلفة متكيفة (عامل التكلفة).



التثبيت:

go get golang.org/x/crypto/bcrypt


مثال على التسجيل وتسجيل الدخول:

package main

import ( "fmt" "golang.org/x/crypto/bcrypt")

func hashPassword(password string) (string, error) { bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) return string(bytes), err}

func checkPasswordHash(password, hash string) bool { err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) return err == nil}

func main() { password := "mySecretP@ssw0rd" hash, _ := hashPassword(password)

fmt.Println("Hash:", hash)

// التحقق من كلمة المرور الصحيحة match := checkPasswordHash(password, hash) fmt.Println("Password match:", match) // true

// التحقق من كلمة مرور خاطئة match = checkPasswordHash("wrong", hash) fmt.Println("Wrong password match:", match) // false}


هام: bcrypt.DefaultCost يساوي 10. لمستوى أمان أعلى (ولكن أبطأ) استخدم القيمة 12-14. لا تستخدم أبدًا تكلفة أقل من 10.



2. JWT (JSON Web Tokens) — github.com/golang-jwt/jwt/v5

JWT هي طريقة مضغوطة لنقل البيانات بين الأطراف على شكل كائن JSON. مثالية لواجهات REST API والخدمات المصغرة. حزمة golang-jwt/jwt هي الأكثر شيوعًا والتي تتم صيانتها بنشاط.



التثبيت:

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


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

package main

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

var jwtSecret = []byte("your-secret-key-keep-it-safe")

func createToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(24 * time.Hour).Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}

func verifyToken(tokenString string) (string, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return jwtSecret, nil }) if err != nil { return "", err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims["user_id"].(string), nil } return "", fmt.Errorf("invalid token")}

func main() { token, _ := createToken("user123") fmt.Println("JWT:", token)

userID, err := verifyToken(token) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Authenticated user:", userID) }}


نصيحة: قم بتخزين المفتاح السري في متغيرات البيئة، وليس في الكود. للإنتاج، استخدم التشفير غير المتماثل (RS256).



3. إدارة الجلسات — gorilla/sessions

لتطبيقات الويب التقليدية مع قوالب HTML، ج

توصيات