package http_handler import ( "git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/mmorpg/service-common/log" "git.hlsq.asia/mmorpg/service-common/net/grpc/grpc_client" "git.hlsq.asia/mmorpg/service-common/net/http/http_resp" "git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/mmorpg/service-gateway/internal/global" "github.com/gin-gonic/gin" ) // 这个模块处理用户登录 type LoginReq struct { Phone string `json:"phone"` // 手机号 Code string `json:"code"` // 验证码 WxMiniCode string `json:"wxMiniCode"` // 微信小程序登录 } type LoginResp struct { USN int64 `json:"usn"` Name string `json:"name"` AccessToken string `json:"accessToken"` RefreshToken string `json:"refreshToken"` } func Login(c *gin.Context) { req := &LoginReq{} if err := c.ShouldBindJSON(req); err != nil { http_resp.JsonBadRequest(c) return } client, err := grpc_client.UserNewClientLB() if err != nil { log.Errorf("Login UserNewClientLB error: %v", err) http_resp.JsonOK(c, http_resp.Error(http_resp.Failed)) return } usn, name := int64(0), "" if req.Phone != "" { // TODO 校验验证码 login, err := client.PhoneLogin(c, &grpc_pb.PhoneLoginReq{ Phone: req.Phone, Code: req.Code, }) if err != nil { log.Errorf("Login PhoneLogin error: %v", err) http_resp.JsonOK(c, http_resp.Error(http_resp.Failed)) return } usn, name = login.USN, login.Name } else if req.WxMiniCode != "" { login, err := client.WxMiniLogin(c, &grpc_pb.WxMiniLoginReq{ Code: req.WxMiniCode, }) if err != nil { log.Errorf("Login WxMiniLogin error: %v", err) http_resp.JsonOK(c, http_resp.Error(http_resp.Failed)) return } usn, name = login.USN, login.Name } else { http_resp.JsonBadRequest(c) return } at, rt, err := sessionLogin(c, usn) if err != nil { log.Errorf("Login sessionLogin error: %v, usn: %v", err, usn) http_resp.JsonOK(c, http_resp.Error(http_resp.Failed)) return } http_resp.JsonOK(c, http_resp.Success(&LoginResp{ USN: usn, Name: name, AccessToken: at, RefreshToken: rt, })) } type RefreshTokenReq struct { RefreshToken string `json:"refreshToken"` } type RefreshTokenResp struct { AccessToken string `json:"accessToken"` RefreshToken string `json:"refreshToken"` } func RefreshToken(c *gin.Context) { req := &RefreshTokenReq{} if err := c.ShouldBindJSON(req); err != nil { http_resp.JsonBadRequest(c) return } if req.RefreshToken == "" { cookie, err := c.Cookie("refresh_token") if err != nil { http_resp.JsonUnauthorized(c) return } req.RefreshToken = cookie } usn, _ := redis.GetClient().HGet(c, global.KeyGatewayRefreshToken+req.RefreshToken, (&utils.UserSession{}).GetUsnKey()).Int64() if usn == 0 { http_resp.JsonUnauthorized(c) return } if err := sessionLogout(c, req.RefreshToken); err != nil { log.Errorf("RefreshToken sessionLogout error: %v, usn: %v", err, usn) } at, rt, err := sessionLogin(c, usn) if err != nil { log.Errorf("RefreshToken sessionLogin error: %v, usn: %v", err, usn) http_resp.JsonOK(c, http_resp.Error(http_resp.Failed)) return } http_resp.JsonOK(c, http_resp.Success(&RefreshTokenResp{ AccessToken: at, RefreshToken: rt, })) } type LogoutReq struct { RefreshToken string `json:"refreshToken"` } type LogoutResp struct { } func Logout(c *gin.Context) { req := &LogoutReq{} if err := c.ShouldBindJSON(req); err != nil { http_resp.JsonBadRequest(c) return } if req.RefreshToken == "" { cookie, err := c.Cookie("refresh_token") if err != nil { http_resp.JsonUnauthorized(c) return } req.RefreshToken = cookie } if err := sessionLogout(c, req.RefreshToken); err != nil { log.Errorf("Logout sessionLogout error: %v", err) } http_resp.JsonOK(c, http_resp.Success(&LogoutResp{})) }