From 0ddbeb3f7a435d4f78b6826e7dd42623435640d3 Mon Sep 17 00:00:00 2001 From: yanghao05 Date: Mon, 6 Feb 2023 09:12:32 +0800 Subject: [PATCH] generate jwt --- modules/auth/controller/user.go | 35 ++++++++++++++++++++++++++++----- modules/auth/dto/user.go | 10 ++++++++++ modules/auth/routes/routes.go | 9 +++++++++ modules/auth/service/user.go | 29 +++++++++++++++++++++++++++ providers/jwt/jwt.go | 22 ++++++++++----------- 5 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 modules/auth/dto/user.go diff --git a/modules/auth/controller/user.go b/modules/auth/controller/user.go index 4b669de..cd4f741 100755 --- a/modules/auth/controller/user.go +++ b/modules/auth/controller/user.go @@ -1,23 +1,48 @@ package controller import ( + "atom/modules/auth/dto" + "atom/modules/auth/service" "atom/providers/config" + "atom/providers/jwt" "github.com/gin-gonic/gin" ) type UserController interface { - GetName(*gin.Context) (string, error) + Login(*gin.Context, dto.LoginRequestForm) (*dto.LoginResponse, error) } type userControllerImpl struct { conf *config.Config + user service.UserService + jwt *jwt.JWT } -func NewUserController(conf *config.Config) UserController { - return &userControllerImpl{conf: conf} +func NewUserController( + conf *config.Config, + user service.UserService, + jwt *jwt.JWT, +) UserController { + return &userControllerImpl{ + conf: conf, + user: user, + jwt: jwt, + } } -func (c *userControllerImpl) GetName(ctx *gin.Context) (string, error) { - return "User",nil +func (c *userControllerImpl) Login(ctx *gin.Context, req dto.LoginRequestForm) (*dto.LoginResponse, error) { + user, err := c.user.AuthMatchPassword(ctx, &req) + if err != nil { + return nil, err + } + + token, err := c.user.GenerateJWTTokenFromUser(ctx, user) + if err != nil { + return nil, err + } + + return &dto.LoginResponse{ + Token: token, + }, nil } diff --git a/modules/auth/dto/user.go b/modules/auth/dto/user.go new file mode 100644 index 0000000..2ff76b6 --- /dev/null +++ b/modules/auth/dto/user.go @@ -0,0 +1,10 @@ +package dto + +type LoginRequestForm struct { + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` +} + +type LoginResponse struct { + Token string `json:"token,omitempty"` +} diff --git a/modules/auth/routes/routes.go b/modules/auth/routes/routes.go index 33cf46e..2d03852 100755 --- a/modules/auth/routes/routes.go +++ b/modules/auth/routes/routes.go @@ -13,6 +13,7 @@ import ( type Route struct { svc *http.Service + user controller.UserController role controller.RoleController permission controller.PermissionController } @@ -20,11 +21,13 @@ type Route struct { func NewRoute( svc *http.Service, role controller.RoleController, + user controller.UserController, permission controller.PermissionController, ) contracts.Route { return &Route{ svc: svc, role: role, + user: user, permission: permission, } } @@ -32,6 +35,12 @@ func NewRoute( func (r *Route) Register() { group := r.svc.Engine.Group("auth") { + // common functions + group.GET("/login", gen.DataFunc1( + r.user.Login, + gen.BindBody(dto.LoginRequestForm{}, err.BindBodyFailed), + )) + roleGroup := group.Group("roles") { roleGroup.GET("", gen.DataFunc2( diff --git a/modules/auth/service/user.go b/modules/auth/service/user.go index e02f2a5..6c80830 100755 --- a/modules/auth/service/user.go +++ b/modules/auth/service/user.go @@ -1,26 +1,34 @@ package service import ( + "atom/database/models" "atom/modules/auth/dao" + "atom/modules/auth/dto" + "atom/providers/jwt" "context" ) type UserService interface { AttachRole(context.Context, int, int) error + AuthMatchPassword(context.Context, *dto.LoginRequestForm) (*models.User, error) + GenerateJWTTokenFromUser(context.Context, *models.User) (string, error) } type userService struct { userRoleDao dao.UserRoleDao userDao dao.UserDao + jwt *jwt.JWT } func NewUserService( userRoleDao dao.UserRoleDao, userDao dao.UserDao, + jwt *jwt.JWT, ) UserService { return &userService{ userRoleDao: userRoleDao, userDao: userDao, + jwt: jwt, } } @@ -37,3 +45,24 @@ func (svc *userService) DetachRole(ctx context.Context, userID, roleID int) erro } return svc.userRoleDao.Delete(ctx, userID, roleID) } +func (svc *userService) AuthMatchPassword(ctx context.Context, req *dto.LoginRequestForm) (*models.User, error) { + return &models.User{ + ID: 10, + UUID: "1", + Username: "2", + Password: "3", + Nickname: "4", + Avatar: "5", + RoleID: 66, + }, nil +} + +func (svc *userService) GenerateJWTTokenFromUser(ctx context.Context, user *models.User) (string, error) { + return svc.jwt.CreateToken(svc.jwt.CreateClaims(jwt.BaseClaims{ + UUID: user.UUID, + UserID: user.ID, + Username: user.Username, + NickName: user.Nickname, + RoleID: user.RoleID, + })) +} diff --git a/providers/jwt/jwt.go b/providers/jwt/jwt.go index 72b4e6c..a698b11 100644 --- a/providers/jwt/jwt.go +++ b/providers/jwt/jwt.go @@ -27,11 +27,11 @@ type CustomClaims struct { } type BaseClaims struct { - UUID uuid.UUID - UserID uint - Username string - NickName string - AuthorityId uint + UUID string + UserID uint64 + Username string + NickName string + RoleID uint64 } type JWT struct { @@ -123,7 +123,7 @@ func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) { } // GetUserID 从Gin的Context中获取从jwt解析出来的用户ID -func (j *JWT) GetUserID(c *gin.Context) uint { +func (j *JWT) GetUserID(c *gin.Context) uint64 { if claims, exists := c.Get("claims"); !exists { if cl, err := j.GetClaims(c); err != nil { return 0 @@ -137,10 +137,10 @@ func (j *JWT) GetUserID(c *gin.Context) uint { } // GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID -func (j *JWT) GetUserUuid(c *gin.Context) uuid.UUID { +func (j *JWT) GetUserUuid(c *gin.Context) string { if claims, exists := c.Get("claims"); !exists { if cl, err := j.GetClaims(c); err != nil { - return uuid.UUID{} + return uuid.UUID{}.String() } else { return cl.UUID } @@ -151,16 +151,16 @@ func (j *JWT) GetUserUuid(c *gin.Context) uuid.UUID { } // GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id -func (j *JWT) GetUserAuthorityId(c *gin.Context) uint { +func (j *JWT) GetRoleId(c *gin.Context) uint64 { if claims, exists := c.Get("claims"); !exists { if cl, err := j.GetClaims(c); err != nil { return 0 } else { - return cl.AuthorityId + return cl.RoleID } } else { waitUse := claims.(*CustomClaims) - return waitUse.AuthorityId + return waitUse.RoleID } }