package httphandler import ( "git.hlsq.asia/alex/service-common/db/redis" "git.hlsq.asia/alex/service-common/log" "git.hlsq.asia/alex/service-common/net/grpc/grpcclient" "git.hlsq.asia/alex/service-common/net/http/httpresp" "git.hlsq.asia/alex/service-common/proto/rs/rspb" "git.hlsq.asia/alex/service-common/utils" "git.hlsq.asia/alex/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 { httpresp.JsonBadRequest(c) return } client, err := grpcclient.UserNewClientLB() if err != nil { log.Errorf("Login UserNewClientLB error: %v", err) httpresp.JsonOK(c, httpresp.Error(httpresp.Failed)) return } usn, name := int64(0), "" if req.Phone != "" { // TODO 校验验证码 login, err := client.PhoneLogin(c, &rspb.PhoneLoginReq{ Phone: req.Phone, Code: req.Code, }) if err != nil { log.Errorf("Login PhoneLogin error: %v", err) httpresp.JsonOK(c, httpresp.Error(httpresp.Failed)) return } usn, name = login.USN, login.Name } else if req.WxMiniCode != "" { login, err := client.WxMiniLogin(c, &rspb.WxMiniLoginReq{ Code: req.WxMiniCode, }) if err != nil { log.Errorf("Login WxMiniLogin error: %v", err) httpresp.JsonOK(c, httpresp.Error(httpresp.Failed)) return } usn, name = login.USN, login.Name } else { httpresp.JsonBadRequest(c) return } at, rt, err := sessionLogin(c, usn) if err != nil { log.Errorf("Login sessionLogin error: %v, usn: %v", err, usn) httpresp.JsonOK(c, httpresp.Error(httpresp.Failed)) return } httpresp.JsonOK(c, httpresp.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 { httpresp.JsonBadRequest(c) return } if req.RefreshToken == "" { cookie, err := c.Cookie("refresh_token") if err != nil { httpresp.JsonUnauthorized(c) return } req.RefreshToken = cookie } usn, _ := redis.GetClient().HGet(c, global.KeyGatewayRefreshToken+req.RefreshToken, (&utils.UserSession{}).GetUsnKey()).Int64() if usn == 0 { httpresp.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) httpresp.JsonOK(c, httpresp.Error(httpresp.Failed)) return } httpresp.JsonOK(c, httpresp.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 { httpresp.JsonBadRequest(c) return } if req.RefreshToken == "" { cookie, err := c.Cookie("refresh_token") if err != nil { httpresp.JsonUnauthorized(c) return } req.RefreshToken = cookie } if err := sessionLogout(c, req.RefreshToken); err != nil { log.Errorf("Logout sessionLogout error: %v", err) } httpresp.JsonOK(c, httpresp.Success(&LogoutResp{})) }