มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
ตรวจสอบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
- มิดเดิลแวร์สำหรับการบันทึกและ ID คำขอ
- มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
- มิดเดิลแวร์ CORS และกู้คืนจาก panic