GoDasturchi
Middleware: Authentication

Middleware: Authentication

Middleware: autentifikatsiya

Eng ko'p ishlatiladigan middleware turlaridan biri — kirish huquqini tekshirish. So'rovda kerakli sarlavha (masalan token) bo'lmasa, asl handler'ga umuman yetib bormaydi.

example.go
package main

import (
	"fmt"
	"net/http"
	"net/http/httptest"
)

func requireAuth(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		if r.Header.Get("Authorization") == "" {
			w.WriteHeader(http.StatusUnauthorized)
			fmt.Fprint(w, "ruxsat yo'q")
			return
		}
		next(w, r)
	}
}

func main() {
	secret := requireAuth(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "maxfiy ma'lumot")
	})

	req := httptest.NewRequest("GET", "/secret", nil)
	rec := httptest.NewRecorder()
	secret(rec, req)
	fmt.Println(rec.Code, rec.Body.String())
}

Muhim naqsh: middleware token yo'qligini ko'rsa, next(w, r) chaqirmaydi va darhol return qiladi — shu tarza asl handler ishga tushmaydi, mijoz esa 401 Unauthorized javobini oladi. Bu — "darvozabon" (gatekeeper) naqshi: middleware ruxsat bermaguncha, hech kim ichkariga kirolmaydi.

>_ Exercise

Faqat to'g'ri API kalitiga ruxsat beradigan middleware yozing.

  • requireAPIKey middleware'ini yozing: "X-API-Key" sarlavhasi "sekret123" ga teng bo'lmasa, 403 va "kirish taqiqlangan" qaytaring
  • to'g'ri bo'lsa next'ni chaqiring
  • ikkita holatni (to'g'ri va noto'g'ri kalit) sinab ko'ring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Autentifikatsiya middleware'i — noto'g'ri so'rovlarni asl handler'ga yetkazmasdan, eng boshida to'xtatadigan "darvozabon".

NEXT UP

HTTP Testing with httptest

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Middleware: Authentication

Middleware: autentifikatsiya

Eng ko'p ishlatiladigan middleware turlaridan biri — kirish huquqini tekshirish. So'rovda kerakli sarlavha (masalan token) bo'lmasa, asl handler'ga umuman yetib bormaydi.

example.go
package main

import (
	"fmt"
	"net/http"
	"net/http/httptest"
)

func requireAuth(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		if r.Header.Get("Authorization") == "" {
			w.WriteHeader(http.StatusUnauthorized)
			fmt.Fprint(w, "ruxsat yo'q")
			return
		}
		next(w, r)
	}
}

func main() {
	secret := requireAuth(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "maxfiy ma'lumot")
	})

	req := httptest.NewRequest("GET", "/secret", nil)
	rec := httptest.NewRecorder()
	secret(rec, req)
	fmt.Println(rec.Code, rec.Body.String())
}

Muhim naqsh: middleware token yo'qligini ko'rsa, next(w, r) chaqirmaydi va darhol return qiladi — shu tarza asl handler ishga tushmaydi, mijoz esa 401 Unauthorized javobini oladi. Bu — "darvozabon" (gatekeeper) naqshi: middleware ruxsat bermaguncha, hech kim ichkariga kirolmaydi.

>_ Exercise

Faqat to'g'ri API kalitiga ruxsat beradigan middleware yozing.

  • requireAPIKey middleware'ini yozing: "X-API-Key" sarlavhasi "sekret123" ga teng bo'lmasa, 403 va "kirish taqiqlangan" qaytaring
  • to'g'ri bo'lsa next'ni chaqiring
  • ikkita holatni (to'g'ri va noto'g'ri kalit) sinab ko'ring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Autentifikatsiya middleware'i — noto'g'ri so'rovlarni asl handler'ga yetkazmasdan, eng boshida to'xtatadigan "darvozabon".

NEXT UP

HTTP Testing with httptest