0Pricing
Go Academy · บทเรียน

มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา

ตรวจสอบ JWT และจำกัดอัตราด้วยโทเค็นบักเก็ต

มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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)

การควบคุมการเข้าถึงตามบทบาท

หลังการยืนยันตัวตน ให้ตรวจสอบบทบาทของผู้ใช้จากข้ออ้างสิทธิ์ในบริบทก่อนเรียกใช้ 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 จะสะสมอยู่ในหน่วยความจำ ให้ล้างตัวจำกัดเหล่านี้ด้วยกอร์รูทีนเบื้องหลังที่ลบรายการซึ่งไม่มีการเข้าถึงในช่วง N นาทีที่ผ่านมา

การจำกัดอัตราแบบกระจาย

ตัวจำกัดอัตราภายในกระบวนการไม่ทำงานข้ามหลายอินสแตนซ์ ให้ใช้ Redis ร่วมกับสคริปต์หน้าต่างเลื่อนหรือสคริปต์ถังโทเค็นสำหรับการจำกัดอัตราแบบกระจาย

429 เทียบกับ 503

ส่งคืน 429 หรือคำขอมากเกินไป เมื่อไคลเอ็นต์รายนั้นถูกจำกัดอัตรา ส่งคืน 503 หรือบริการไม่พร้อมใช้งาน เมื่อบริการทั้งหมดมีโหลดเกินและกำลังลดภาระงาน

การรวมการยืนยันตัวตนและการจำกัดอัตรา

ใช้ทั้งสองอย่างเป็นมิดเดิลแวร์แยกกันในสายการทำงาน ให้การยืนยันตัวตนทำงานก่อน เพื่อจำกัดอัตราเฉพาะผู้ใช้ที่ยืนยันตัวตนแล้ว และแยกตาม ID ผู้ใช้แทน IP

การทดสอบมิดเดิลแวร์การยืนยันตัวตน

ใช้ httptest ส่งโทเค็นที่ถูกต้องและไม่ถูกต้อง แล้วตรวจสอบว่าตั้งค่ารหัสสถานะและค่าบริบทได้ถูกต้อง

ตรวจสอบอย่างรวดเร็ว

มิดเดิลแวร์จำกัดอัตราควรส่งคืนรหัสสถานะ HTTP ใดเมื่อไคลเอ็นต์เกินขีดจำกัด

สรุป: การยืนยันตัวตนและการจำกัดอัตรา

ประเด็นสำคัญ:

  • มิดเดิลแวร์ JWT: ดึงโทเค็น Bearer → แยกวิเคราะห์ → แนบข้ออ้างสิทธิ์เข้ากับบริบท
  • จำกัดอัตราด้วย golang.org/x/time/rate โดยแยกตาม IP หรือผู้ใช้
  • ส่งคืน 429 พร้อมส่วนหัว Retry-After เมื่อเกินขีดจำกัด
  • แบบกระจาย: ใช้ Redis สำหรับการจำกัดอัตราหลายอินสแตนซ์

คำถามที่พบบ่อย

บทเรียน “มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา”

ตรวจสอบ JWT และจำกัดอัตราด้วยโทเค็นบักเก็ต คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
  2. มิดเดิลแวร์สำหรับการบันทึกและ ID คำขอ
  3. มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
  4. มิดเดิลแวร์ CORS และกู้คืนจาก panic
← กลับไปที่ Go Academy