Files
relay-server/middleware/protected.go

42 lines
1.2 KiB
Go

package middleware
import (
"fmt"
jwtware "github.com/gofiber/contrib/jwt"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v5"
"github.com/google/uuid"
"os"
"relay-server/helpers"
"relay-server/model"
)
func Protected() fiber.Handler {
return jwtware.New(jwtware.Config{
SigningKey: jwtware.SigningKey{Key: []byte(os.Getenv("JWT_SECRET"))},
ErrorHandler: jwtError,
TokenLookup: "cookie:token",
Claims: &model.UserClaims{},
SuccessHandler: func(c *fiber.Ctx) error {
user := c.Locals("user").(*jwt.Token)
claims := user.Claims.(*model.UserClaims)
userID, err := uuid.Parse(claims.UserID)
if err != nil {
return helpers.NewError(helpers.ErrInternal, "internal server error", fmt.Errorf("failed to parse user ID: %w", err))
}
c.Locals("userID", userID)
c.Locals("username", claims.Username)
return c.Next()
},
})
}
func jwtError(c *fiber.Ctx, err error) error {
if err.Error() == "Missing or malformed JWT" {
return c.Status(fiber.StatusBadRequest).
JSON(fiber.Map{"error": "Missing or malformed token"})
}
return c.Status(fiber.StatusUnauthorized).
JSON(fiber.Map{"error": "Invalid or expired token"})
}