golang-jwt في Go: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

مكتبة golang-jwt في Go: دليل شامل مع أمثلة عملية

مكتبة golang-jwt (الاسم الرسمي: github.com/golang-jwt/jwt/v5) هي المعيار الفعلي لتنفيذ JSON Web Tokens (JWT) في لغة Go. توفر هذه المكتبة للمطورين أدوات قوية ومرنة لإنشاء وتوقيع والتحقق من صحة وفك تشفير رموز JWT. JWT هو وسيلة مضغوطة ومكتفية ذاتياً لنقل المعلومات بين الأطراف على شكل كائن JSON، ويمكن التحقق من صحته لأنه موقع بتوقيع رقمي. تُستخدم رموز JWT على نطاق واسع في المصادقة والتفويض وتبادل البيانات الآمن في REST API والهياكل الخدمية المصغرة وتطبيقات الويب.

لماذا تحتاج هذه المكتبة؟ في تطوير الويب الحديث بلغة Go، أي تطبيق يتطلب مصادقة المستخدمين (مثل خوادم API والخدمات المصغرة وأنظمة الدخول الموحد) سيواجه حتماً الحاجة للتعامل مع JWT. تتولى مكتبة golang-jwt كل التعقيدات: إنشاء والتحقق من التوقيعات (HMAC, RSA, ECDSA, EdDSA)، تحليل الرؤوس والحمولة، ومعالجة الحقول القياسية (exp, iat, iss, sub) والحقول المخصصة. بدونها، سيتعين عليك تنفيذ العمليات التشفيرية وتحليل JSON يدوياً، مما يعرضك للأخطاء والثغرات الأمنية.

المزايا الرئيسية لـ golang-jwt: دعم كامل لمواصفة RFC 7519، سهولة الاستخدام بفضل الواجهة السلسة، أداء عالي (تستخدم مكتبة crypto القياسية)، وإمكانية التوسع عبر طرق توقيع وتحقق مخصصة. المكتبة مدعومة بنشاط من المجتمع، ولديها أكثر من 7 آلاف نجمة على GitHub، وتُستخدم في مشاريع مثل Kubernetes وDocker وGrafana وغيرها الكثير.

التثبيت

يتم تثبيت المكتبة بالطريقة القياسية في Go عبر الأمر go get. تأكد من أن لديك Go الإصدار 1.18 أو أحدث (يُوصى باستخدام 1.21+).

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

بعد تنفيذ الأمر، سيظهر التابع في ملف go.mod الخاص بك. لاستيراد المكتبة في الكود، استخدم التالي:

import "github.com/golang-jwt/jwt/v5"

بداية سريعة — مثال عملي بسيط

لننشئ مثالاً بسيطاً: إنشاء رمز JWT والتحقق من صحته باستخدام مفتاح متماثل (HMAC-SHA256).

package main

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

func main() {
    // 1. المفتاح السري (يجب حفظه بأمان)
    secretKey := []byte("my-super-secret-key-12345")

    // 2. إنشاء الرمز
    claims := jwt.MapClaims{
        "user_id": 12345,
        "role":    "admin",
        "exp":     time.Now().Add(time.Hour * 24).Unix(), // صلاحية 24 ساعة
        "iat":     time.Now().Unix(),                     // وقت الإنشاء
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenString, err := token.SignedString(secretKey)
    if err != nil {
        panic(err)
    }
    fmt.Println("الرمز المُنشأ:", tokenString)

    // 3. التحقق من صحة الرمز وتحليله
    parsedToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        // نتحقق من أن طريقة التوقيع هي HMAC
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("طريقة توقيع غير متوقعة: %v", token.Header["alg"])
        }
        return secretKey, nil
    })

    if err != nil {
        panic(err)
    }

    // 4. استخراج المطالبات (claims)
    if claims, ok := parsedToken.Claims.(jwt.MapClaims); ok && parsedToken.Valid {
        fmt.Printf("معرف المستخدم: %v\n", claims["user_id"])
        fmt.Printf("الدور: %v\n", claims["role"])
    } else {
        fmt.Println("الرمز غير صالح")
    }
}

الدوال والطرق الأساسية

دعنا نستعرض أهم دوال المكتبة. لكل دالة نقدم التوقيع والوصف ومثالاً عملياً.

توصيات