From d65489d6728e23d9cc90e2858d6a113403a0e587 Mon Sep 17 00:00:00 2001 From: XiaoLFeng Date: Tue, 26 Dec 2023 16:29:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=99=BB=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/interface.go | 1 + api/request/authApi.go | 4 ++++ .../controller/auth/user/authController.go | 23 +++++++++++++----- .../TokenServiceImpl/tokenServiceImpl.go | 18 ++++++++++++++ .../logic/UserServiceImpl/userServiceImpl.go | 11 +++++++++ internal/middleware/globalMiddleware.go | 24 ++++++++++++------- internal/service/TokenService/tokenService.go | 1 + internal/service/UserService/userService.go | 1 + 8 files changed, 69 insertions(+), 14 deletions(-) diff --git a/api/interface.go b/api/interface.go index a6ff64c..ff8df2c 100644 --- a/api/interface.go +++ b/api/interface.go @@ -17,6 +17,7 @@ type IAuthV1 interface { AuthRegister(ctx context.Context, req *request.RegisterReq) (res *request.RegisterRes, err error) AuthLogin(ctx context.Context, req *request.LoginReq) (res *request.LoginRes, err error) AuthCheck(ctx context.Context, req *request.CheckReq) (res *request.CheckRes, err error) + AuthLogout(ctx context.Context, req *request.LogoutReq) (res *request.LogoutRes, err error) } type ITokenV1 interface { diff --git a/api/request/authApi.go b/api/request/authApi.go index 92b9b46..a2ddf69 100644 --- a/api/request/authApi.go +++ b/api/request/authApi.go @@ -13,7 +13,11 @@ type LoginReq struct { type CheckReq struct { g.Meta `path:"/check" tags:"检查登录" method:"get" summary:"检查登录"` } +type LogoutReq struct { + g.Meta `path:"/logout" tags:"登出" method:"delete" summary:"登出账号"` +} type RegisterRes struct{} type LoginRes struct{} type CheckRes struct{} +type LogoutRes struct{} diff --git a/internal/controller/auth/user/authController.go b/internal/controller/auth/user/authController.go index 8ac86b8..b7e1d25 100644 --- a/internal/controller/auth/user/authController.go +++ b/internal/controller/auth/user/authController.go @@ -11,6 +11,10 @@ import ( "github.com/gogf/gf/v2/net/ghttp" ) +func userService() UserService.UserService { + return UserService.NewUserService() +} + // AuthRegister // // 用户注册 @@ -23,8 +27,7 @@ func (*ControllerV1) AuthRegister(ctx context.Context, _ *request.RegisterReq) ( errStruct := g.Validator().Data(userRegister).Run(ctx) if errStruct == nil { // 进行用户注册 - userService := UserService.NewUserService() - userService.UserRegister(req, &userRegister) + userService().UserRegister(req, &userRegister) } else { ResultUtil.Error(req, ErrorCode.RequestBodyMismatching, errStruct.Map()) } @@ -43,8 +46,7 @@ func (*ControllerV1) AuthLogin(ctx context.Context, _ *request.LoginReq) (res *r errStruct := g.Validator().Data(userLogin).Run(ctx) if errStruct == nil { // 进行用户注册 - userService := UserService.NewUserService() - userService.UserLogin(req, &userLogin) + userService().UserLogin(req, &userLogin) } else { ResultUtil.Error(req, ErrorCode.RequestBodyMismatching, errStruct.Map()) } @@ -60,7 +62,16 @@ func (*ControllerV1) AuthLogin(ctx context.Context, _ *request.LoginReq) (res *r func (*ControllerV1) AuthCheck(ctx context.Context, _ *request.CheckReq) (res *request.CheckRes, err error) { req := ghttp.RequestFromCtx(ctx) // 获取数据库中用户信息 - userService := UserService.NewUserService() - userService.CheckLogin(req) + userService().CheckLogin(req) + return res, err +} + +// AuthLogout +// +// 用户登出 +func (*ControllerV1) AuthLogout(ctx context.Context, _ *request.LogoutReq) (res *request.LogoutRes, err error) { + req := ghttp.RequestFromCtx(ctx) + // 获取数据库中用户信息 + userService().UserLogout(req) return res, err } diff --git a/internal/logic/TokenServiceImpl/tokenServiceImpl.go b/internal/logic/TokenServiceImpl/tokenServiceImpl.go index 1788fc9..3479f58 100644 --- a/internal/logic/TokenServiceImpl/tokenServiceImpl.go +++ b/internal/logic/TokenServiceImpl/tokenServiceImpl.go @@ -77,3 +77,21 @@ func (_ DefaultTokenImpl) LoginToken(req *ghttp.Request, userDO do.UserDO) *do.T } return nil } + +// DeleteToken +// +// 删除Token业务 +func (_ DefaultTokenImpl) DeleteToken(req *ghttp.Request) bool { + // 获取 Cookie 中的 token + cookieToken := req.Cookie.Get("token") + if cookieToken != nil { + // 数据库查找 token + token := tokenDAO.GetToken(cookieToken.String()) + // 检查数据库中是否存在该 token + if token != nil { + // 删除数据库 + return tokenDAO.DeleteToken(token.Token) + } + } + return false +} diff --git a/internal/logic/UserServiceImpl/userServiceImpl.go b/internal/logic/UserServiceImpl/userServiceImpl.go index d15baba..1c47f12 100644 --- a/internal/logic/UserServiceImpl/userServiceImpl.go +++ b/internal/logic/UserServiceImpl/userServiceImpl.go @@ -98,3 +98,14 @@ func (*DefaultUserImpl) CheckLogin(req *ghttp.Request) { ResultUtil.ErrorNoData(req, ErrorCode.UserNotExist) } } + +// UserLogout +// +// 用户登出 +func (*DefaultUserImpl) UserLogout(req *ghttp.Request) { + if tokenService().DeleteToken(req) { + ResultUtil.Success(req, "用户已退出登录", nil) + } else { + ResultUtil.ErrorNoData(req, ErrorCode.TokenNotFound) + } +} diff --git a/internal/middleware/globalMiddleware.go b/internal/middleware/globalMiddleware.go index 9e2d4f2..9a09152 100644 --- a/internal/middleware/globalMiddleware.go +++ b/internal/middleware/globalMiddleware.go @@ -4,7 +4,9 @@ import ( "PersonalMain/internal/service/TokenService" "PersonalMain/utility/ErrorCode" "PersonalMain/utility/ResultUtil" + "context" "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/text/gregex" "net/http" @@ -26,19 +28,24 @@ type DefaultHandlerResponse struct { // 检查时间戳误差是否在 func TimestampMiddleware(r *ghttp.Request) { // 检查时间戳误差是否在 - timestamp, err := strconv.ParseInt(r.GetHeader("timestamp"), 10, 64) - if gregex.IsMatch(`^[0-9]{13,14}$`, []byte(strconv.FormatInt(timestamp, 10))) { - if timestamp+int64(2000) > time.Now().UnixMilli() && timestamp-int64(2000) < time.Now().UnixMilli() { - r.Middleware.Next() + timestampString := r.GetHeader("timestamp") + if len(timestampString) >= 13 && len(timestampString) <= 14 { + timestamp, err := strconv.ParseInt(timestampString, 10, 64) + if gregex.IsMatch(`^[0-9]+$`, []byte(strconv.FormatInt(timestamp, 10))) { + if timestamp+int64(2000) > time.Now().UnixMilli() && timestamp-int64(2000) < time.Now().UnixMilli() { + r.Middleware.Next() + } else { + if err != nil { + ResultUtil.ErrorNoData(r, ErrorCode.TimestampExpired) + } + } } else { if err != nil { - ResultUtil.ErrorNoData(r, ErrorCode.TimestampExpired) + ResultUtil.ErrorNoData(r, ErrorCode.TimestampVerifyFailed) } } } else { - if err != nil { - ResultUtil.ErrorNoData(r, ErrorCode.TimestampVerifyFailed) - } + ResultUtil.ErrorNoData(r, ErrorCode.TimestampVerifyFailed) } } @@ -101,6 +108,7 @@ func JsonResponseMiddleware(r *ghttp.Request) { msg = ErrorCode.ServerUnknownError.Message() output = ErrorCode.ServerUnknownError.Output() } + g.Log().Cat("Unknown").Info(context.Background(), output, msg) } } diff --git a/internal/service/TokenService/tokenService.go b/internal/service/TokenService/tokenService.go index e9fd975..2d64fc3 100644 --- a/internal/service/TokenService/tokenService.go +++ b/internal/service/TokenService/tokenService.go @@ -18,4 +18,5 @@ type TokenService interface { GetToken(*ghttp.Request) *do.TokenDO VerifyToken(*do.TokenDO) bool LoginToken(*ghttp.Request, do.UserDO) *do.TokenDO + DeleteToken(*ghttp.Request) bool } diff --git a/internal/service/UserService/userService.go b/internal/service/UserService/userService.go index 6bcde6b..e48074d 100644 --- a/internal/service/UserService/userService.go +++ b/internal/service/UserService/userService.go @@ -14,4 +14,5 @@ type UserService interface { UserRegister(*ghttp.Request, *entity.UserRegisterVO) UserLogin(*ghttp.Request, *entity.UserLoginVO) CheckLogin(*ghttp.Request) + UserLogout(*ghttp.Request) }