| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package auth
- import (
- "net/http"
- "strings"
- )
- // AuthMiddleware extracts and validates JWT tokens from requests
- func AuthMiddleware(next http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- authHeader := r.Header.Get("Authorization")
- if authHeader == "" {
- // No token, proceed without user in context
- next.ServeHTTP(w, r)
- return
- }
- // Extract Bearer token
- parts := strings.SplitN(authHeader, " ", 2)
- if len(parts) != 2 || strings.ToLower(parts[0]) != "bearer" {
- // Invalid header format, proceed without user
- next.ServeHTTP(w, r)
- return
- }
- tokenString := parts[1]
- claims, err := ValidateToken(tokenString)
- if err != nil {
- // Invalid token, proceed without user
- next.ServeHTTP(w, r)
- return
- }
- // Add user to context
- user := &UserContext{
- ID: claims.UserID,
- Email: claims.Email,
- Roles: claims.Roles,
- Permissions: claims.Permissions,
- }
- ctx := WithUser(r.Context(), user)
- next.ServeHTTP(w, r.WithContext(ctx))
- })
- }
|