42 lines
1.1 KiB
Go
42 lines
1.1 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/model"
|
|
"relay-server/utils"
|
|
)
|
|
|
|
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 utils.NewError(utils.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"})
|
|
}
|