package utils import ( "errors" "github.com/gofiber/fiber/v2" "gitea.pena/PenaSide/tariffs/internal/models" "strings" ) const ( prefix = "Bearer " ) func NewAuthenticator(jwtUtil *JWT) fiber.Handler { return func(c *fiber.Ctx) error { if jwtUtil == nil { return fiber.NewError(fiber.StatusInternalServerError, "Invalid arguments") } err := authenticate(jwtUtil, c) if err != nil { return fiber.NewError(fiber.StatusUnauthorized, err.Error()) } return c.Next() } } func authenticate(jwtUtil *JWT, c *fiber.Ctx) error { jws, err := parseJWSFromRequest(c) if err != nil { return err } userID, validateErr := jwtUtil.Validate(jws) if validateErr != nil { return validateErr } c.Locals(models.AuthJWTDecodedUserIDKey, userID) c.Locals(models.AuthJWTDecodedAccessTokenKey, jws) return nil } func parseJWSFromRequest(c *fiber.Ctx) (string, error) { header := c.Get("Authorization") if header != "" && strings.HasPrefix(header, prefix) { return strings.TrimPrefix(header, prefix), nil } token := c.Query("Authorization") if token == "" { return "", errors.New("failed to parse jws from request: no valid token found") } return token, nil }