ایجاد یک Middleware برای لاگ گیری و احراز هویت در Golang

ایجاد یک Middleware برای لاگ گیری و احراز هویت در Golang

در گولنگ Middleware شبیه یک تیم از نگهبانان متخصص هست که درخواست‌های HTTP را قبل از رسیدن به منطق اصلی برنامه شما پردازش و مدیریت می‌کنه.

در گولنگ Middleware شبیه یک تیم از نگهبانان متخصص هست که درخواست‌های HTTP را قبل از رسیدن به منطق اصلی برنامه شما پردازش و مدیریت می‌کنه.

در این پست، به طور عمیق به ایجاد و استفاده از middleware برای ثبت لاگ، احراز هویت، و مدیریت خطاها میپردازیم تا به شما در تقویت برنامه‌های وب Go و جلوگیری از مشکلات رایج کمک کنیم و عملکرد آن‌ها را بهبود بخشیم.

 

راه‌اندازی یک سرور وب پایه در Go

برای شروع، ابتدا یک سرور وب ساده با استفاده از بسته‌ی net/http راه‌اندازی می‌کنیم.

package main 

import (
    "log"
    "net/http"
)

func main() {
  // Define a handler function for the main logic
    mainHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })
    
  // Use the middleware chain with mainHandler
    http.Handle("/", Logger(Authenticate(mainHandler)))
    
 // Start the server on port 8080
    log.Println("Server listening on port 8080...")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

 

توضیح:

  • mainHandler یک تابع handler ساده است که به درخواست‌ها با "Hello, World!" پاسخ می‌دهد.
  • توابع middleware (Logger و Authenticate) با mainHandler زنجیر شده‌اند.
  • سرور روی پورت 8080 با استفاده از http.ListenAndServe فعال و گوش می‌دهد.

ایجاد توابع Middleware

Middleware برای ثبت لاگ

این middleware اطلاعات مربوط به درخواست‌های ورودی را قبل از اینکه آن‌ها را به handler بعدی ارسال کند ثبت میکند.

 

func Logger(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Log the request URI and method
        log.Printf("Request URI: %s, Method: %s", r.RequestURI, r.Method)
        // Call the next handler
        next.ServeHTTP(w, r)
    })
}

توضیح:

  • Logger درخواست‌های URI و متد HTTP را با استفاده از بسته log ثبت می‌کند.
  • پس از ثبت، درخواست به middleware یا handler بعدی در زنجیره ارسال می‌شود.

Middleware برای احراز هویت

این middleware اعتبار درخواست‌های ورودی را بر اساس معیارهای از پیش تعریف‌شده بررسی می‌کند، مثل بررسی وجود توکن معتبر.

func Authenticate(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Dummy authentication check (example: check if the request has a valid token)
        token := r.Header.Get("Authorization")
        if token != "valid_token" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        // Call the next handler
        next.ServeHTTP(w, r)
    })
}

توضیح:

  • Authenticate بررسی می‌کند که آیا توکن معتبر در هدر Authorization درخواست وجود دارد.
  • اگر توکن نامعتبر باشد یا وجود نداشته باشد، یک پاسخ 401 Unauthorized ارسال می‌کند.
  • در صورت وجود توکن معتبر، درخواست به middleware یا handler بعدی ارسال می‌شود.

Middleware برای مدیریت خطا

این middleware با استفاده از recover از خطاهای غیرمنتظره بازیابی می‌کند و یک پاسخ مناسب ارسال می‌کند.

func ErrorHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Recover from panics and handle errors
        defer func() {
            if r := recover(); r != nil {
                log.Printf("Recovered from panic: %v", r)
                http.Error(w, "Internal Server Error", http.StatusInternalServerError)
            }
        }()
        // Call the next handler
        next.ServeHTTP(w, r)
    })
}

توضیح:

  • ErrorHandler با استفاده از defer و recover() از panic ها بازیابی می‌کند.
  • در صورت بروز panic، پیام مربوطه ثبت می‌شود و یک پاسخ 500 Internal Server Error ارسال می‌شود.
  • این کار تضمین می‌کند که برنامه حتی پس از بروز خطاهای غیرمنتظره همچنان به کار خود ادامه می‌دهد.

استفاده از Middleware در HTTP Handlers

می‌توانید middleware را با handler اصلی خود ادغام کنید تا عملکرد و قابلیت اطمینان سرور وب خود را بهبود بخشید.

func main() {
    // Define a handler function for the main logic
    mainHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Business logic here
        w.Write([]byte("Hello, World!"))
    })
    
    // Use the middleware chain with mainHandler
    http.Handle("/", ErrorHandler(Logger(Authenticate(mainHandler))))
    
    // Start the server on port 8080
    log.Println("Server listening on port 8080...")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

توضیح:

  • توابع middleware (ErrorHandler، Logger و Authenticate) به ترتیب با mainHandler زنجیر شده‌اند.
  • ترتیب middleware مهم است: ابتدا ErrorHandler، سپس Logger و در نهایت Authenticate، تا خطاها در اولویت مدیریت شوند و سپس لاگ‌ها ثبت و احراز هویت انجام شود.

 

امیدوارم این مقاله برای شما مفید بوده باشه. سعی میکنم از این پس مقالات بیشتری در مورد گولنگ بذارم. خوشحال میشم از قسمت نظرات، نظر خودتون رو با ما در میون بذارید.


برچسب ها:

golang گولنگ Middleware

دسته بندی ها:

گولنگ

ارسال نظر

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!
لسیت نظرات
هنوز برای این مطلب نظری ارسال نشده است!