0Pricing
Go Academy · درس

Middleware المصادقة وتحديد معدل الطلبات

التحقق من JWT وتحديد معدل الطلبات باستخدام دلو الرموز

Middleware المصادقة وتحديد معدل الطلبات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

برمجية وسيطة لمصادقة JWT

استخرج JWT من ترويسة Authorization، ثم حلّله وتحقّق من صحته:

func JWTAuth(secret []byte) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            header := r.Header.Get("Authorization")
            if !strings.HasPrefix(header, "Bearer ") {
                http.Error(w, "missing token", 401); return
            }
            token := strings.TrimPrefix(header, "Bearer ")
            claims, err := parseJWT(token, secret)
            if err != nil {
                http.Error(w, "invalid token", 401); return
            }
            ctx := context.WithValue(r.Context(), claimsKey{}, claims)
            next.ServeHTTP(w, r.WithContext(ctx))
        })
    }
}

مصادقة مفتاح API

تحقّق من صحة مفتاح API الموجود في ترويسة بمقارنته بقاعدة بيانات أو بمجموعة موجودة في الذاكرة:

func APIKeyAuth(validKeys map[string]bool) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            key := r.Header.Get("X-API-Key")
            if !validKeys[key] {
                http.Error(w, "forbidden", 403); return
            }
            next.ServeHTTP(w, r)
        })
    }
}

محدِّد معدل الطلبات باستخدام دلو الرموز

استخدم golang.org/x/time/rate مع خريطة لمحدِّدات خاصة بكل عنوان IP:

var limiters sync.Map

func getLimiter(ip string) *rate.Limiter {
    v, _ := limiters.LoadOrStore(ip, rate.NewLimiter(rate.Every(time.Second), 10))
    return v.(*rate.Limiter)
}

برمجية وسيطة لتحديد معدل الطلبات

تحقّق من المحدِّد في البرمجية الوسيطة، وأعِد 429 إذا تم تجاوز الحد:

func RateLimit(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        ip, _, _ := net.SplitHostPort(r.RemoteAddr)
        if !getLimiter(ip).Allow() {
            http.Error(w, "rate limit exceeded", 429); return
        }
        next.ServeHTTP(w, r)
    })
}

ترويسة Retry-After

أدرج ترويسة Retry-After التي تحتوي على عدد الثواني التي ينبغي للعميل انتظارها قبل إعادة المحاولة:

w.Header().Set("Retry-After", "1")
http.Error(w, "rate limit exceeded", 429)

التحكم في الوصول المستند إلى الأدوار

بعد المصادقة، تحقّق من أدوار المستخدم الموجودة في مطالبات context قبل استدعاء Next:

func RequireRole(role string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            claims := claimsFromContext(r.Context())
            if !claims.HasRole(role) {
                http.Error(w, "forbidden", 403); return
            }
            next.ServeHTTP(w, r)
        })
    }
}

تنظيف المحدِّدات

تتراكم المحدِّدات القديمة الخاصة بكل عنوان IP في الذاكرة. نظّفها باستخدام goroutine تعمل في الخلفية وتحذف الإدخالات التي لم يُصل إليها خلال آخر N دقائق.

تحديد معدل الطلبات الموزّع

لا تعمل المحدِّدات داخل العملية عبر مثيلات متعددة. استخدم Redis مع نافذة منزلقة أو برنامج نصي لدلو الرموز لتحديد معدل الطلبات الموزّع.

مقارنة 429 و503

أعِد 429 Too Many Requests عندما يكون العميل الفردي خاضعًا لتحديد معدل الطلبات. وأعِد 503 Service Unavailable عندما تكون الخدمة بأكملها محمّلة فوق طاقتها وتتخلّص من بعض الحمل.

دمج المصادقة وتحديد معدل الطلبات

طبّقهما كبرمجيتين وسيطتين منفصلتين في السلسلة. المصادقة أولًا: حدّد معدل الطلبات للمستخدمين الذين تمت مصادقتهم فقط، كي تميّز بينهم باستخدام معرّف المستخدم بدلًا من عنوان IP.

اختبار البرمجية الوسيطة للمصادقة

استخدم httptest لتمرير رموز مميّزة صالحة وغير صالحة، وتحقّق من تعيين رموز الحالة الصحيحة وقيم context.

تحقق سريع

ما رمز حالة HTTP الذي ينبغي أن تعيده البرمجية الوسيطة لتحديد معدل الطلبات عندما يتجاوز العميل الحد المسموح له؟

مراجعة: المصادقة وتحديد معدل الطلبات

النقاط الرئيسية:

  • برمجية JWT الوسيطة: استخراج رمز Bearer → تحليله → إرفاق المطالبات بـ context
  • حدّد معدل الطلبات باستخدام golang.org/x/time/rate لكل عنوان IP أو مستخدم
  • أعِد 429 مع ترويسة Retry-After عند تجاوز الحد
  • للتوزيع: استخدم Redis لتحديد معدل الطلبات عبر مثيلات متعددة

الأسئلة الشائعة

هل درس «Middleware المصادقة وتحديد معدل الطلبات» مجاني؟

نعم — نص درس «Middleware المصادقة وتحديد معدل الطلبات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «Middleware المصادقة وتحديد معدل الطلبات»؟

التحقق من JWT وتحديد معدل الطلبات باستخدام دلو الرموز تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «Middleware المصادقة وتحديد معدل الطلبات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات سلسلة Middleware لـ HTTP
  2. Middleware التسجيل ومعرّف الطلب
  3. Middleware المصادقة وتحديد معدل الطلبات
  4. Middleware لـ CORS واستعادة ما بعد panic
← العودة إلى Go Academy