رموز JWT في Go (Golang): الإنشاء والتحقق مع أمثلة

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

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

ابدأ الدورة

رموز JWT في Go (Golang): دليل كامل

\n\n

JSON Web Tokens (JWT) هي معيار مفتوح (RFC 7519) لإنشاء رموز الوصول المستندة إلى JSON. تُستخدم JWT على نطاق واسع للمصادقة وتبادل المعلومات بين العميل والخادم. في لغة Go (Golang)، يتم العمل مع رموز JWT ببساطة وفعالية بفضل مكتبة golang-jwt/jwt.

\n\n

في هذه المقالة، سنشرح بالتفصيل إنشاء وتوقيع والتحقق واستخدام رموز JWT في Go. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنفيذ مصادقة آمنة في مشاريعهم على Golang.

\n\n

تثبيت مكتبة golang-jwt

\n\n

للعمل مع JWT في Go، يتم استخدام الحزمة github.com/golang-jwt/jwt/v5. قم بتثبيتها باستخدام الأمر:

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

بعد التثبيت، يمكن استيراد الحزمة إلى الكود الخاص بك:

\n\n
import (\n    "github.com/golang-jwt/jwt/v5"\n)
\n\n

هيكل رمز JWT

\n\n

يتكون رمز JWT من ثلاثة أجزاء مفصولة بنقاط:

\n\n
    \n
  • Header (الرأس) — يحتوي على نوع الرمز (JWT) وخوارزمية التوقيع (مثل HS256 أو RS256).
  • \n
  • Payload (الحمولة) — يحتوي على البيانات (المطالبات) مثل معرف المستخدم، الدور، تاريخ انتهاء الصلاحية، إلخ.
  • \n
  • Signature (التوقيع) — يتم إنشاؤه بناءً على الرأس والحمولة باستخدام مفتاح سري أو زوج مفاتيح RSA/ECDSA.
  • \n
\n\n

إنشاء رمز JWT في Go

\n\n

لننظر إلى مثال لإنشاء رمز JWT باستخدام خوارزمية HMAC-SHA256 (HS256). ستحتاج إلى مفتاح سري لهذا الغرض.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n    // المفتاح السري (يجب تخزينه في مكان آمن)\n    secretKey := []byte("my_secret_key_12345")\n\n    // إنشاء المطالبات (الادعاءات)\n    claims := jwt.MapClaims{\n        "user_id": 123,\n        "role":    "admin",\n        "exp":     time.Now().Add(time.Hour * 24).Unix(), // الرمز صالح لمدة 24 ساعة\n        "iat":     time.Now().Unix(),\n    }\n\n    // إنشاء الرمز\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n\n    // توقيع الرمز بالمفتاح السري\n    tokenString, err := token.SignedString(secretKey)\n    if err != nil {\n        fmt.Println("خطأ في إنشاء الرمز:", err)\n        return\n    }\n\n    fmt.Println("رمز JWT الذي تم إنشاؤه:")\n    fmt.Println(tokenString)\n}
\n\n

التحقق من رمز JWT وتحليله

\n\n

للتحقق من صحة الرمز، يتم استخدام نفس المفتاح السري. من المهم التحقق من تاريخ انتهاء الصلاحية والتوقيع.

\n\n
package main\n\nimport (\n    "fmt"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n    tokenString := "رمزك_هنا"\n    secretKey := []byte("my_secret_key_12345")\n\n    // تحليل والتحقق من الرمز\n    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\n        // التحقق من خوارزمية التوقيع\n        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\n            return nil, fmt.Errorf("طريقة توقيع غير متوقعة: %v", token.Header["alg"])\n        }\n        return secretKey, nil\n    })\n\n    if err != nil {\n        fmt.Println("خطأ في التحقق من الرمز:", err)\n        return\n    }\n\n    // استخراج المطالبات\n    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {\n        fmt.Println("الرمز صالح!")\n        fmt.Printf("معرف المستخدم: %v\\n", claims["user_id"])\n        fmt.Printf("الدور: %v\\n", claims["role"])\n    } else {\n        fmt.Println("الرمز غير صالح")\n    }\n}
\n\n

استخدام المطالبات المهيكلة

\n\n

لتسهيل الأمور، يمكن تعريف هيكل مطالبات مخصص يقوم بتنفيذ واجهة jwt.Claims:

\n\n
type CustomClaims struct {\n    UserID int    `json:"user_id"`\n    Role   string `json:"role"`\n    jwt.RegisteredCl                    

توصيات