diff --git a/go.mod b/go.mod index fb541e2..9fce9b0 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/muety/wakapi go 1.13 require ( - github.com/codegangsta/negroni v1.0.0 github.com/gobuffalo/packr/v2 v2.8.0 + github.com/gorilla/handlers v1.4.2 github.com/gorilla/mux v1.7.3 github.com/gorilla/schema v1.1.0 github.com/gorilla/securecookie v1.1.1 @@ -13,7 +13,6 @@ require ( github.com/joho/godotenv v1.3.0 github.com/kr/pretty v0.2.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/rs/cors v1.7.0 github.com/rubenv/sql-migrate v0.0.0-20200402132117-435005d389bc github.com/satori/go.uuid v1.2.0 github.com/t-tiger/gorm-bulk-insert v0.0.0-20191014134946-beb77b81825f diff --git a/go.sum b/go.sum index 3bcb0fb..6817cd0 100644 --- a/go.sum +++ b/go.sum @@ -35,8 +35,6 @@ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/negroni v1.0.0 h1:+aYywywx4bnKXWvoWtRfJ91vC59NbEhEY03sZjQhbVY= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= @@ -126,6 +124,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -308,8 +308,6 @@ github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.5.2 h1:qLvObTrvO/XRCqmkKxUlOBc48bI3efyDuAZe25QiF0w= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rubenv/sql-migrate v0.0.0-20200402132117-435005d389bc h1:+2DdDcxVYlarHjYcZTt8dZ4Ec8cXZirzL5ko0mkKPjU= github.com/rubenv/sql-migrate v0.0.0-20200402132117-435005d389bc/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= diff --git a/main.go b/main.go index 6cd5a66..9bc6d6d 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "encoding/hex" "encoding/json" + "github.com/gorilla/handlers" "github.com/gorilla/securecookie" "io/ioutil" "log" @@ -13,12 +14,10 @@ import ( "strings" "time" - "github.com/codegangsta/negroni" "github.com/gobuffalo/packr/v2" "github.com/gorilla/mux" "github.com/jinzhu/gorm" "github.com/joho/godotenv" - "github.com/rs/cors" "github.com/rubenv/sql-migrate" uuid "github.com/satori/go.uuid" ini "gopkg.in/ini.v1" @@ -180,27 +179,34 @@ func main() { healthHandler := routes.NewHealthHandler(db) indexHandler := routes.NewIndexHandler(config, userSrvc) - // Middlewares - authenticateMiddleware := middlewares.NewAuthenticateMiddleware(config, userSrvc, []string{"/api/health"}) - corsMiddleware := cors.New(cors.Options{ - AllowedOrigins: []string{"*"}, - AllowedHeaders: []string{"*"}, - Debug: false, - }) - - // Setup Routing + // Setup Routers router := mux.NewRouter() - mainRouter := mux.NewRouter().PathPrefix("/").Subrouter() - summaryRouter := mux.NewRouter().PathPrefix("/summary").Subrouter() - apiRouter := mux.NewRouter().PathPrefix("/api").Subrouter() + indexRouter := router.PathPrefix("/").Subrouter() + summaryRouter := indexRouter.PathPrefix("/summary").Subrouter() + apiRouter := router.PathPrefix("/api").Subrouter() - // Main Routes - mainRouter.Path("/").Methods(http.MethodGet).HandlerFunc(indexHandler.Index) - mainRouter.Path("/login").Methods(http.MethodPost).HandlerFunc(indexHandler.Login) - mainRouter.Path("/logout").Methods(http.MethodPost).HandlerFunc(indexHandler.Logout) + // Middlewares + recoveryMiddleware := handlers.RecoveryHandler() + loggingMiddleware := middlewares.NewLoggingMiddleware().Handler + corsMiddleware := handlers.CORS() + authenticateMiddleware := middlewares.NewAuthenticateMiddleware( + config, + userSrvc, + []string{"/api/health"}, + ).Handler + + // Router configs + router.Use(loggingMiddleware, recoveryMiddleware) + summaryRouter.Use(authenticateMiddleware) + apiRouter.Use(corsMiddleware, authenticateMiddleware) + + // Public Routes + indexRouter.Path("/").Methods(http.MethodGet).HandlerFunc(indexHandler.Index) + indexRouter.Path("/login").Methods(http.MethodPost).HandlerFunc(indexHandler.Login) + indexRouter.Path("/logout").Methods(http.MethodPost).HandlerFunc(indexHandler.Logout) // Summary Routes - summaryRouter.Path("").Methods(http.MethodGet).HandlerFunc(summaryHandler.Index) + summaryRouter.Methods(http.MethodGet).HandlerFunc(summaryHandler.Index) // API Routes apiRouter.Path("/heartbeat").Methods(http.MethodPost).HandlerFunc(heartbeatHandler.ApiPost) @@ -208,24 +214,7 @@ func main() { apiRouter.Path("/health").Methods(http.MethodGet).HandlerFunc(healthHandler.ApiGet) // Static Routes - router.PathPrefix("/assets").Handler(negroni.Classic().With(negroni.Wrap(http.FileServer(http.Dir("./static"))))) - - // Sub-Routes Setup - router.PathPrefix("/api").Handler(negroni.Classic(). - With(corsMiddleware). - With( - negroni.HandlerFunc(authenticateMiddleware.Handle), - negroni.Wrap(apiRouter), - )) - - router.PathPrefix("/summary").Handler(negroni.Classic().With( - negroni.HandlerFunc(authenticateMiddleware.Handle), - negroni.Wrap(summaryRouter), - )) - - router.PathPrefix("/").Handler(negroni.Classic().With( - negroni.Wrap(mainRouter), - )) + router.PathPrefix("/assets").Handler(http.FileServer(http.Dir("./static"))) // Listen HTTP portString := config.Addr + ":" + strconv.Itoa(config.Port) diff --git a/middlewares/authenticate.go b/middlewares/authenticate.go index 00607eb..6010095 100644 --- a/middlewares/authenticate.go +++ b/middlewares/authenticate.go @@ -30,7 +30,13 @@ func NewAuthenticateMiddleware(config *models.Config, userService *services.User } } -func (m *AuthenticateMiddleware) Handle(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { +func (m *AuthenticateMiddleware) Handler(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + m.ServeHTTP(w, r, h.ServeHTTP) + }) +} + +func (m *AuthenticateMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { for _, p := range m.whitelistPaths { if strings.HasPrefix(r.URL.Path, p) || r.URL.Path == p { next(w, r) diff --git a/middlewares/logging.go b/middlewares/logging.go new file mode 100644 index 0000000..2170d67 --- /dev/null +++ b/middlewares/logging.go @@ -0,0 +1,17 @@ +package middlewares + +import ( + "github.com/gorilla/handlers" + "net/http" + "os" +) + +type LoggingMiddleware struct{} + +func NewLoggingMiddleware() *LoggingMiddleware { + return &LoggingMiddleware{} +} + +func (m *LoggingMiddleware) Handler(h http.Handler) http.Handler { + return handlers.LoggingHandler(os.Stdout, h) +}