tcuongtran / codepad

0 stars 0 forks source link

Token Authentication in Go #6

Open tcuongtran opened 1 week ago

tcuongtran commented 1 week ago

Auth.go:

package main

import (
    "net/http"
    "strings"

    "github.com/golang-jwt/jwt/v4"
)

func authMiddleware(next http.HandlerFunc, jwtSecret string) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
                w.Header().Set("Content-Type", "application/json")
        authHeader := r.Header.Get("Authorization")
        if authHeader == "" {
            http.Error(w, "Missing auth token", http.StatusUnauthorized)
            return
        }

        bearerToken := strings.Split(authHeader, " ")
        if len(bearerToken) != 2 || strings.ToLower(bearerToken[0]) != "bearer" {
            http.Error(w, "Invalid token format", http.StatusUnauthorized)
            return
        }

        token := bearerToken[1]

        // Verify the token
        claims := jwt.MapClaims{}
        _, err := jwt.ParseWithClaims(token, claims, func(token *jwt.Token) (interface{}, error) {
            return []byte(jwtSecret), nil
        })

        if err != nil {
            http.Error(w, "Invalid token", http.StatusUnauthorized)
            return
        }

        // You can access claims if needed
        // For example: userID := claims["sub"].(string)

        next.ServeHTTP(w, r)
    }
}

main.go:

func main() {
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    jwtSecret := os.Getenv("JWT_SECRET")
    if jwtSecret == "" {
        log.Fatal("Please set the JWT_SECRET environment variable")
    }

    // Create a new ServeMux
    mux := http.NewServeMux()

    mux.HandleFunc("/api/items", authMiddleware(handleItems, jwtSecret))
    mux.HandleFunc("/api/item", authMiddleware(handleItem, jwtSecret))

    nextSubFS, err := fs.Sub(nextFS, "client/dist")
    if err != nil {
        log.Fatal(err)
    }
    mux.Handle("/", http.FileServer(http.FS(nextSubFS)))

    fmt.Println("Server is running on port 8080...")
    log.Fatal(http.ListenAndServe(":8080", mux))
}