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