diff --git a/kontor-api-go/cmd/kontor/main.go b/kontor-api-go/cmd/kontor/main.go index dd25ac8..bc4b8f1 100644 --- a/kontor-api-go/cmd/kontor/main.go +++ b/kontor-api-go/cmd/kontor/main.go @@ -5,6 +5,7 @@ import ( "kontor-api-go/pkg/schema" "log" + jwtware "github.com/gofiber/contrib/jwt" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/logger" ) @@ -18,10 +19,17 @@ func main() { app := fiber.New() + // app.Use(jwtware.New(jwtware.Config{ + // SigningKey: jwtware.SigningKey{Key: []byte("secret")}, + // })) + // app.Use(logger.New()) app.Get("/health", handler.GetHealth) + app.Post("/login", handler.Login) - api := app.Group("/api", logger.New()) + api := app.Group("/api", logger.New(), jwtware.New(jwtware.Config{ + SigningKey: jwtware.SigningKey{Key: []byte("secret")}, + })) handler.SetupComicRoutes(api) handler.SetupMediaRoutes(api) // Listen on port 8900 diff --git a/kontor-api-go/go.mod b/kontor-api-go/go.mod index 316b13f..6958a7e 100644 --- a/kontor-api-go/go.mod +++ b/kontor-api-go/go.mod @@ -3,10 +3,13 @@ module kontor-api-go go 1.24.2 require ( + github.com/MicahParks/keyfunc/v2 v2.1.0 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect github.com/clipperhouse/uax29/v2 v2.3.0 // indirect + github.com/gofiber/contrib/jwt v1.1.2 // indirect github.com/gofiber/fiber/v2 v2.52.10 // indirect + github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/klauspost/compress v1.18.1 // indirect diff --git a/kontor-api-go/go.sum b/kontor-api-go/go.sum index a1d9e53..33c3839 100644 --- a/kontor-api-go/go.sum +++ b/kontor-api-go/go.sum @@ -1,3 +1,5 @@ +github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k= +github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= @@ -5,6 +7,8 @@ github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfa github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/gofiber/contrib/jwt v1.1.2 h1:GmWnOqT4A15EkA8IPXwSpvNUXZR4u5SMj+geBmyLAjs= +github.com/gofiber/contrib/jwt v1.1.2/go.mod h1:CpIwrkUQ3Q6IP8y9n3f0wP9bOnSKx39EDp2fBVgMFVk= github.com/gofiber/fiber v1.14.6 h1:QRUPvPmr8ijQuGo1MgupHBn8E+wW0IKqiOvIZPtV70o= github.com/gofiber/fiber v1.14.6/go.mod h1:Yw2ekF1YDPreO9V6TMYjynu94xRxZBdaa8X5HhHsjCM= github.com/gofiber/fiber/v2 v2.52.10 h1:jRHROi2BuNti6NYXmZ6gbNSfT3zj/8c0xy94GOU5elY= @@ -12,6 +16,8 @@ github.com/gofiber/fiber/v2 v2.52.10/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAre github.com/gofiber/utils v0.0.10/go.mod h1:9J5aHFUIjq0XfknT4+hdSMG6/jzfaAgCu4HEbWDeBlo= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= diff --git a/kontor-api-go/pkg/handler/auth.go b/kontor-api-go/pkg/handler/auth.go new file mode 100644 index 0000000..45b913f --- /dev/null +++ b/kontor-api-go/pkg/handler/auth.go @@ -0,0 +1,43 @@ +package handler + +import ( + "time" + + "github.com/gofiber/fiber/v2" + "github.com/golang-jwt/jwt/v5" +) + +func Login(c *fiber.Ctx) error { + user := c.FormValue("user") + pass := c.FormValue("pass") + + // Throws Unauthorized error + if user != "john" || pass != "doe" { + return c.SendStatus(fiber.StatusUnauthorized) + } + + // Create the Claims + claims := jwt.MapClaims{ + "name": "John Doe", + "admin": true, + "exp": time.Now().Add(time.Hour * 72).Unix(), + } + + // Create token + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + + // Generate encoded token and send it as response. + t, err := token.SignedString([]byte("secret")) + if err != nil { + return c.SendStatus(fiber.StatusInternalServerError) + } + + return c.JSON(fiber.Map{"token": t}) +} + +func Restricted(c *fiber.Ctx) error { + user := c.Locals("user").(*jwt.Token) + claims := user.Claims.(jwt.MapClaims) + name := claims["name"].(string) + return c.SendString("Welcome " + name) +} diff --git a/kontor-api-go/pkg/handler/media.go b/kontor-api-go/pkg/handler/media.go index 9bb8b52..6502312 100644 --- a/kontor-api-go/pkg/handler/media.go +++ b/kontor-api-go/pkg/handler/media.go @@ -6,8 +6,10 @@ import ( "fmt" "kontor-api-go/pkg/schema" "log" + "time" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" "github.com/uptrace/bun" ) @@ -51,7 +53,9 @@ func AddFile(c *fiber.Ctx) error { if err != nil { log.Fatal(err) } - mediafile := &schema.MediaFile{WebLink: fmt.Sprintf("%s", link), Version: 1, ShouldDownload: true, Review: true} + id := uuid.NewString() + timestamp := time.Now() + mediafile := &schema.MediaFile{ID: id, CreatedAt: timestamp, UpdatedAt: timestamp, WebLink: fmt.Sprintf("%s", link), Version: 1, ShouldDownload: true, Review: true} _, err = db.NewInsert().Model(mediafile).Exec(ctx) if err != nil { return err