156 lines
3.8 KiB
Go
156 lines
3.8 KiB
Go
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{}))
|
|
}
|