From 89a062520cbea5f7a6c1db6856e2857ebcc2496f Mon Sep 17 00:00:00 2001 From: fbonhomm Date: Tue, 3 Sep 2019 17:56:22 +0200 Subject: [PATCH] refactor: minor changement --- source/controllers/auth.go | 81 ++++++++++-------------- source/controllers/utils.go | 25 ++++++++ source/libs/generate-access-token.go | 4 +- source/models/user.go | 5 ++ source/routers/auth.go | 2 +- source/routers/index.go | 36 +++++++++++ source/routers/user.go | 2 +- source/services/jwt.go | 14 ++-- source/validators/auth.go | 4 +- source/validators/{index.go => utils.go} | 3 +- 10 files changed, 117 insertions(+), 59 deletions(-) create mode 100644 source/controllers/utils.go create mode 100644 source/routers/index.go rename source/validators/{index.go => utils.go} (99%) diff --git a/source/controllers/auth.go b/source/controllers/auth.go index 6726a22..a72531d 100644 --- a/source/controllers/auth.go +++ b/source/controllers/auth.go @@ -7,72 +7,59 @@ package controllers import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/fbonhomm/api-go/source/libs" "github.com/fbonhomm/api-go/source/models" "github.com/fbonhomm/api-go/source/services" - "github.com/gin-gonic/gin" - "net/http" ) // AuthLogin func AuthLogin(c *gin.Context) { - user := models.User{ + var accessToken string + var refreshToken string + var err error + var user = models.User{ Email: c.PostForm("email"), } - if err := services.Db.First(&user).Error; err != nil { + if err = services.Db.First(&user).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) - return - } - if err := user.Compare(c.PostForm("password")); err != nil { + } else if err = user.Compare(c.PostForm("password")); err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error() }) - return + } else if accessToken, err = libs.GenerateAccessToken(user); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } else if refreshToken, err = libs.GenerateRefreshToken(user); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } else { + c.JSON(http.StatusOK, gin.H{ + "access_token": accessToken, + "refresh_token": refreshToken, + }) } - - accessToken, err := libs.GenerateAccessToken(user) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error() }) - return - } - - refreshToken, err := libs.GenerateRefreshToken(user) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error() }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "access_token": accessToken, - "refresh_token": refreshToken, - }) } // AuthRefresh func AuthRefresh(c *gin.Context) { - user := models.User{} + var accessToken string + var refreshToken string + var err error + var user = models.User{} - token, _ := c.Get("Token") - info := token.(map[string]string) + token, _ := GetToken(c) - if err := services.Db.First(&user, info["id"]).Error; err != nil { + if err = services.Db.First(&user, token["id"]).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) - return + } else if accessToken, err = libs.GenerateAccessToken(user); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } else if refreshToken, err = libs.GenerateRefreshToken(user); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } else { + c.JSON(http.StatusOK, gin.H{ + "access_token": accessToken, + "refresh_token": refreshToken, + }) } - - accessToken, err := libs.GenerateAccessToken(user) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error() }) - return - } - - refreshToken, err := libs.GenerateRefreshToken(user) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error() }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "access_token": accessToken, - "refresh_token": refreshToken, - }) } diff --git a/source/controllers/utils.go b/source/controllers/utils.go new file mode 100644 index 0000000..9051493 --- /dev/null +++ b/source/controllers/utils.go @@ -0,0 +1,25 @@ +/** + * Created by fbonhomm + * Email: flo-github@outlook.fr + * Licence: MIT + */ + +package controllers + +import ( + "errors" + "github.com/gin-gonic/gin" +) + +// GetToken +func GetToken(c *gin.Context) (info map[string]string, err error) { + token, ok := c.Get("Token") + + if ok == false { + err = errors.New("token is not found") + } else { + info = token.(map[string]string) + } + + return info, err +} diff --git a/source/libs/generate-access-token.go b/source/libs/generate-access-token.go index 1fbf5c0..a5758a6 100644 --- a/source/libs/generate-access-token.go +++ b/source/libs/generate-access-token.go @@ -7,10 +7,12 @@ package libs import ( + "time" + "github.com/dgrijalva/jwt-go" + "github.com/fbonhomm/api-go/source/models" "github.com/fbonhomm/api-go/source/services" - "time" ) // GenerateAccessToken diff --git a/source/models/user.go b/source/models/user.go index a6ed710..1554342 100644 --- a/source/models/user.go +++ b/source/models/user.go @@ -11,6 +11,11 @@ import ( "golang.org/x/crypto/bcrypt" ) +// ID uint `gorm:"primary_key"` +// CreatedAt time.Time +// UpdatedAt time.Time +// DeletedAt *time.Time `sql:"index"` + type User struct { gorm.Model Name string `gorm:"type:varchar(50);not null" json:"name"` diff --git a/source/routers/auth.go b/source/routers/auth.go index a71efbd..5a895f2 100644 --- a/source/routers/auth.go +++ b/source/routers/auth.go @@ -17,6 +17,6 @@ import ( func Auth(router *gin.Engine) { route := router.Group("/auth") - route.POST("/", validators.ValidateAuthLogin, controllers.AuthLogin) + route.POST("", validators.ValidateAuthLogin, controllers.AuthLogin) route.POST("/refresh", middlewares.AuthRefresh, validators.ValidateAuthRefresh, controllers.AuthRefresh) } diff --git a/source/routers/index.go b/source/routers/index.go new file mode 100644 index 0000000..cba1c3d --- /dev/null +++ b/source/routers/index.go @@ -0,0 +1,36 @@ +/** + * Created by fbonhomm + * Email: flo-github@outlook.fr + * Licence: MIT + */ + +package routers + +import ( + "os" + "time" + + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" +) + +// RouterInitialize +// Initialize all api route +func RouterInitialize() *gin.Engine { + routerEngine := gin.Default() + + routerEngine.Use(cors.New(cors.Config{ + AllowOrigins: []string{os.Getenv("HOST") + ":" + os.Getenv("PORT")}, + AllowMethods: []string{"OPTIONS", "GET", "POST", "PUT", "DELETE"}, + AllowHeaders: []string{"Origin", "Content-Type", "Content-Length", "Accept-Encoding", "Authorization"}, + ExposeHeaders: []string{"Content-Length"}, + AllowCredentials: true, + MaxAge: 12 * time.Hour, + })) + + User(routerEngine) + Auth(routerEngine) + + return routerEngine +} + diff --git a/source/routers/user.go b/source/routers/user.go index e457ace..efa22f9 100644 --- a/source/routers/user.go +++ b/source/routers/user.go @@ -17,7 +17,7 @@ import ( func User(router *gin.Engine) { route := router.Group("/users") - route.POST("/", middlewares.Auth, validators.ValidateUserCreate, controllers.UserCreate) + route.POST("", middlewares.Auth, validators.ValidateUserCreate, controllers.UserCreate) route.GET("/:id", middlewares.Auth, validators.ValidateUserGetId, controllers.UserGetId) route.DELETE("/:id", middlewares.Auth, validators.ValidateUserDeleteId, controllers.UserDeleteId) } diff --git a/source/services/jwt.go b/source/services/jwt.go index daf383f..8a7c067 100644 --- a/source/services/jwt.go +++ b/source/services/jwt.go @@ -8,11 +8,12 @@ package services import ( "crypto/ecdsa" - "github.com/dgrijalva/jwt-go" "io/ioutil" + "os" + + "github.com/dgrijalva/jwt-go" ) -const ROOT = "./source/services" var PublicKeyAccess *ecdsa.PublicKey var PrivateKeyAccess *ecdsa.PrivateKey @@ -22,16 +23,17 @@ var err error func Jwt() { var tmp []byte + var root = os.Getenv("ROOT") + "/source/services" - tmp, _ = ioutil.ReadFile(ROOT + "/jwt/access.public.pem") + tmp, err = ioutil.ReadFile(root + "/jwt/access.public.pem") PublicKeyAccess, _ = jwt.ParseECPublicKeyFromPEM(tmp) - tmp, _ = ioutil.ReadFile(ROOT + "/jwt/access.private.pem") + tmp, _ = ioutil.ReadFile(root + "/jwt/access.private.pem") PrivateKeyAccess, _ = jwt.ParseECPrivateKeyFromPEM(tmp) - tmp, _ = ioutil.ReadFile(ROOT + "/jwt/refresh.public.pem") + tmp, _ = ioutil.ReadFile(root + "/jwt/refresh.public.pem") PublicKeyRefresh, _ = jwt.ParseECPublicKeyFromPEM(tmp) - tmp, _ = ioutil.ReadFile(ROOT + "/jwt/refresh.private.pem") + tmp, _ = ioutil.ReadFile(root + "/jwt/refresh.private.pem") PrivateKeyRefresh, _ = jwt.ParseECPrivateKeyFromPEM(tmp) } diff --git a/source/validators/auth.go b/source/validators/auth.go index 37228a8..0126a7d 100644 --- a/source/validators/auth.go +++ b/source/validators/auth.go @@ -12,8 +12,8 @@ import ( ) type authLogin struct { - Email string `form:"email" binding:"required,email"` - Password string `form:"password" binding:"required,min=8,max=50"` + Email string `form:"email" binding:"required,email"` + Password string `form:"password" binding:"required,min=8,max=50"` } type authRefresh struct { diff --git a/source/validators/index.go b/source/validators/utils.go similarity index 99% rename from source/validators/index.go rename to source/validators/utils.go index 31ab3f7..4fb5169 100644 --- a/source/validators/index.go +++ b/source/validators/utils.go @@ -7,8 +7,9 @@ package validators import ( - "github.com/gin-gonic/gin" "net/http" + + "github.com/gin-gonic/gin" ) func errorHandling(c *gin.Context, msg string) {