mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-10 01:02:27 +08:00
优化架构
This commit is contained in:
38
dispatch/controller/auto_patch_controller.go
Normal file
38
dispatch/controller/auto_patch_controller.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
func (c *Controller) headDataVersions(context *gin.Context) {
|
||||
context.Header("Content-Type", "application/octet-stream")
|
||||
context.Header("Content-Length", "514")
|
||||
context.Status(http.StatusOK)
|
||||
}
|
||||
|
||||
func (c *Controller) getDataVersions(context *gin.Context) {
|
||||
dataVersions, err := os.ReadFile("static/data_versions")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open data_versions error")
|
||||
return
|
||||
}
|
||||
context.Data(http.StatusOK, "application/octet-stream", dataVersions)
|
||||
}
|
||||
|
||||
func (c *Controller) headBlk(context *gin.Context) {
|
||||
context.Header("Content-Type", "application/octet-stream")
|
||||
context.Header("Content-Length", "14103")
|
||||
context.Status(http.StatusOK)
|
||||
}
|
||||
|
||||
func (c *Controller) getBlk(context *gin.Context) {
|
||||
blk, err := os.ReadFile("static/29342328.blk")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open 29342328.blk error")
|
||||
return
|
||||
}
|
||||
context.Data(http.StatusOK, "application/octet-stream", blk)
|
||||
}
|
||||
144
dispatch/controller/controller.go
Normal file
144
dispatch/controller/controller.go
Normal file
@@ -0,0 +1,144 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"github.com/gin-gonic/gin"
|
||||
pb "google.golang.org/protobuf/proto"
|
||||
"hk4e/common/config"
|
||||
"hk4e/common/region"
|
||||
"hk4e/dispatch/dao"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Controller struct {
|
||||
dao *dao.Dao
|
||||
regionListBase64 string
|
||||
regionCurrBase64 string
|
||||
signRsaKey []byte
|
||||
encRsaKeyMap map[string][]byte
|
||||
pwdRsaKey []byte
|
||||
}
|
||||
|
||||
func NewController(dao *dao.Dao) (r *Controller) {
|
||||
r = new(Controller)
|
||||
r.dao = dao
|
||||
r.regionListBase64 = ""
|
||||
r.regionCurrBase64 = ""
|
||||
regionCurr, regionList := region.InitRegion(config.CONF.Hk4e.KcpAddr, config.CONF.Hk4e.KcpPort)
|
||||
r.signRsaKey, r.encRsaKeyMap, r.pwdRsaKey = region.LoadRsaKey()
|
||||
regionCurrModify, err := pb.Marshal(regionCurr)
|
||||
if err != nil {
|
||||
logger.LOG.Error("Marshal QueryCurrRegionHttpRsp error")
|
||||
return nil
|
||||
}
|
||||
r.regionCurrBase64 = base64.StdEncoding.EncodeToString(regionCurrModify)
|
||||
regionListModify, err := pb.Marshal(regionList)
|
||||
if err != nil {
|
||||
logger.LOG.Error("Marshal QueryRegionListHttpRsp error")
|
||||
return nil
|
||||
}
|
||||
r.regionListBase64 = base64.StdEncoding.EncodeToString(regionListModify)
|
||||
r.runEngine()
|
||||
return r
|
||||
}
|
||||
|
||||
func (c *Controller) runEngine() {
|
||||
if config.CONF.Logger.Level == "DEBUG" {
|
||||
gin.SetMode(gin.DebugMode)
|
||||
} else {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
}
|
||||
go func() {
|
||||
engine := c.registerRouter()
|
||||
port := config.CONF.HttpPort
|
||||
addr := ":" + strconv.FormatInt(int64(port), 10)
|
||||
err := engine.Run(addr)
|
||||
if err != nil {
|
||||
logger.LOG.Error("gin run error: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (c *Controller) registerRouter() *gin.Engine {
|
||||
engine := gin.Default()
|
||||
{
|
||||
// 404
|
||||
engine.NoRoute(func(context *gin.Context) {
|
||||
logger.LOG.Info("no route find, fallback to fuck mhy, url: %v", context.Request.RequestURI)
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
context.Status(http.StatusNotFound)
|
||||
_, _ = context.Writer.WriteString("FUCK MHY")
|
||||
})
|
||||
}
|
||||
{
|
||||
// 调度
|
||||
// dispatchosglobal.yuanshen.com
|
||||
engine.GET("/query_security_file", c.query_security_file)
|
||||
engine.GET("/query_region_list", c.query_region_list)
|
||||
// osusadispatch.yuanshen.com
|
||||
engine.GET("/query_cur_region", c.query_cur_region)
|
||||
}
|
||||
{
|
||||
// 登录
|
||||
// hk4e-sdk-os.hoyoverse.com
|
||||
// 账号登录
|
||||
engine.POST("/hk4e_global/mdk/shield/api/login", c.apiLogin)
|
||||
// token登录
|
||||
engine.POST("/hk4e_global/mdk/shield/api/verify", c.apiVerify)
|
||||
// 获取combo token
|
||||
engine.POST("/hk4e_global/combo/granter/login/v2/login", c.v2Login)
|
||||
}
|
||||
{
|
||||
// BLK文件补丁下载
|
||||
// autopatchhk.yuanshen.com
|
||||
engine.HEAD("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/data_versions", c.headDataVersions)
|
||||
engine.GET("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/data_versions", c.getDataVersions)
|
||||
engine.HEAD("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/blocks/00/29342328.blk", c.headBlk)
|
||||
engine.GET("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/blocks/00/29342328.blk", c.getBlk)
|
||||
}
|
||||
{
|
||||
// 日志
|
||||
engine.POST("/sdk/dataUpload", c.sdkDataUpload)
|
||||
engine.GET("/perf/config/verify", c.perfConfigVerify)
|
||||
engine.POST("/perf/dataUpload", c.perfDataUpload)
|
||||
engine.POST("/log", c.log8888)
|
||||
engine.POST("/crash/dataUpload", c.crashDataUpload)
|
||||
}
|
||||
{
|
||||
// 返回固定数据
|
||||
// Windows
|
||||
engine.GET("/hk4e_global/mdk/agreement/api/getAgreementInfos", c.getAgreementInfos)
|
||||
engine.POST("/hk4e_global/combo/granter/api/compareProtocolVersion", c.postCompareProtocolVersion)
|
||||
engine.POST("/account/risky/api/check", c.check)
|
||||
engine.GET("/combo/box/api/config/sdk/combo", c.combo)
|
||||
engine.GET("/hk4e_global/combo/granter/api/getConfig", c.getConfig)
|
||||
engine.GET("/hk4e_global/mdk/shield/api/loadConfig", c.loadConfig)
|
||||
engine.POST("/data_abtest_api/config/experiment/list", c.list)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m2020030410/m2020030410-version.json", c.version10Json)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m2020030410/m2020030410-zh-cn.json", c.zhCN10Json)
|
||||
engine.GET("/geetestV2.html", c.geetestV2)
|
||||
// Android
|
||||
engine.POST("/common/h5log/log/batch", c.batch)
|
||||
engine.GET("/hk4e_global/combo/granter/api/getFont", c.getFont)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m202003049/m202003049-version.json", c.version9Json)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m202003049/m202003049-zh-cn.json", c.zhCN9Json)
|
||||
engine.GET("/hk4e_global/combo/granter/api/compareProtocolVersion", c.getCompareProtocolVersion)
|
||||
// Android geetest
|
||||
engine.GET("/gettype.php", c.gettype)
|
||||
engine.GET("/get.php", c.get)
|
||||
engine.POST("/ajax.php", c.ajax)
|
||||
engine.GET("/ajax.php", c.ajax)
|
||||
engine.GET("/static/appweb/app3-index.html", c.app3Index)
|
||||
engine.GET("/static/js/slide.7.8.6.js", c.slideJs)
|
||||
engine.GET("/favicon.ico", c.faviconIco)
|
||||
engine.GET("/static/js/gct.e7810b5b525994e2fb1f89135f8df14a.js", c.js)
|
||||
engine.GET("/static/ant/style_https.1.2.6.css", c.css)
|
||||
engine.GET("/pictures/gt/a330cf996/a330cf996.webp", c.webp)
|
||||
engine.GET("/pictures/gt/a330cf996/bg/86f9db021.webp", c.bgWebp)
|
||||
engine.GET("/pictures/gt/a330cf996/slice/86f9db021.png", c.slicePng)
|
||||
engine.GET("/static/ant/sprite2x.1.2.6.png", c.sprite2xPng)
|
||||
}
|
||||
return engine
|
||||
}
|
||||
144
dispatch/controller/dispatch_controller.go
Normal file
144
dispatch/controller/dispatch_controller.go
Normal file
@@ -0,0 +1,144 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"github.com/gin-gonic/gin"
|
||||
"hk4e/common/utils/endec"
|
||||
"hk4e/dispatch/entity/api"
|
||||
"hk4e/logger"
|
||||
"math"
|
||||
"net/http"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func (c *Controller) query_security_file(context *gin.Context) {
|
||||
file, err := os.ReadFile("static/security_file")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open security_file error")
|
||||
return
|
||||
}
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString(string(file))
|
||||
}
|
||||
|
||||
func (c *Controller) query_region_list(context *gin.Context) {
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString(c.regionListBase64)
|
||||
}
|
||||
|
||||
func (c *Controller) query_cur_region(context *gin.Context) {
|
||||
versionName := context.Query("version")
|
||||
response := "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="
|
||||
if len(context.Request.URL.RawQuery) > 0 {
|
||||
response = c.regionCurrBase64
|
||||
}
|
||||
reg, err := regexp.Compile("[0-9]+")
|
||||
if err != nil {
|
||||
logger.LOG.Error("compile regexp error: %v", err)
|
||||
return
|
||||
}
|
||||
versionSlice := reg.FindAllString(versionName, -1)
|
||||
version := 0
|
||||
for index := 0; index < len(versionSlice); index++ {
|
||||
v, err := strconv.Atoi(versionSlice[index])
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse client version error: %v", err)
|
||||
return
|
||||
}
|
||||
for i := 0; i < len(versionSlice)-1-index; i++ {
|
||||
v *= 10
|
||||
}
|
||||
version += v
|
||||
}
|
||||
if version >= 1000 {
|
||||
// 测试版本
|
||||
version /= 10
|
||||
}
|
||||
if version >= 275 {
|
||||
logger.LOG.Debug("do hk4e 2.8 rsa logic")
|
||||
if context.Query("dispatchSeed") == "" {
|
||||
rsp := &api.QueryCurRegionRspJson{
|
||||
Content: response,
|
||||
Sign: "TW9yZSBsb3ZlIGZvciBVQSBQYXRjaCBwbGF5ZXJz",
|
||||
}
|
||||
context.JSON(http.StatusOK, rsp)
|
||||
return
|
||||
}
|
||||
keyId := context.Query("key_id")
|
||||
encPubPrivKey, exist := c.encRsaKeyMap[keyId]
|
||||
if !exist {
|
||||
logger.LOG.Error("can not found key id: %v", keyId)
|
||||
return
|
||||
}
|
||||
regionInfo, err := base64.StdEncoding.DecodeString(response)
|
||||
if err != nil {
|
||||
logger.LOG.Error("decode region info error: %v", err)
|
||||
return
|
||||
}
|
||||
chunkSize := 256 - 11
|
||||
regionInfoLength := len(regionInfo)
|
||||
numChunks := int(math.Ceil(float64(regionInfoLength) / float64(chunkSize)))
|
||||
encryptedRegionInfo := make([]byte, 0)
|
||||
for i := 0; i < numChunks; i++ {
|
||||
from := i * chunkSize
|
||||
to := int(math.Min(float64((i+1)*chunkSize), float64(regionInfoLength)))
|
||||
chunk := regionInfo[from:to]
|
||||
pubKey, err := endec.RsaParsePubKeyByPrivKey(encPubPrivKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa pub key error: %v", err)
|
||||
return
|
||||
}
|
||||
privKey, err := endec.RsaParsePrivKey(encPubPrivKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa priv key error: %v", err)
|
||||
return
|
||||
}
|
||||
encrypt, err := endec.RsaEncrypt(chunk, pubKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa enc error: %v", err)
|
||||
return
|
||||
}
|
||||
decrypt, err := endec.RsaDecrypt(encrypt, privKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa dec error: %v", err)
|
||||
return
|
||||
}
|
||||
if bytes.Compare(decrypt, chunk) != 0 {
|
||||
logger.LOG.Error("rsa dec test fail")
|
||||
return
|
||||
}
|
||||
encryptedRegionInfo = append(encryptedRegionInfo, encrypt...)
|
||||
}
|
||||
signPrivkey, err := endec.RsaParsePrivKey(c.signRsaKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa priv key error: %v", err)
|
||||
return
|
||||
}
|
||||
signData, err := endec.RsaSign(regionInfo, signPrivkey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa sign error: %v", err)
|
||||
return
|
||||
}
|
||||
ok, err := endec.RsaVerify(regionInfo, signData, &signPrivkey.PublicKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa verify error: %v", err)
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
logger.LOG.Error("rsa verify test fail")
|
||||
return
|
||||
}
|
||||
rsp := &api.QueryCurRegionRspJson{
|
||||
Content: base64.StdEncoding.EncodeToString(encryptedRegionInfo),
|
||||
Sign: base64.StdEncoding.EncodeToString(signData),
|
||||
}
|
||||
context.JSON(http.StatusOK, rsp)
|
||||
return
|
||||
} else {
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString(response)
|
||||
}
|
||||
}
|
||||
233
dispatch/controller/fixed_controller.go
Normal file
233
dispatch/controller/fixed_controller.go
Normal file
File diff suppressed because one or more lines are too long
33
dispatch/controller/log_controller.go
Normal file
33
dispatch/controller/log_controller.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package controller
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
// POST https://log-upload-os.mihoyo.com/sdk/dataUpload HTTP/1.1
|
||||
func (c *Controller) sdkDataUpload(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// GET http://log-upload-os.hoyoverse.com/perf/config/verify?device_id=dd664c97f924af747b4576a297c132038be239291651474673768&platform=2&name=DESKTOP-EDUS2DL HTTP/1.1
|
||||
func (c *Controller) perfConfigVerify(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// POST http://log-upload-os.hoyoverse.com/perf/dataUpload HTTP/1.1
|
||||
func (c *Controller) perfDataUpload(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// POST http://overseauspider.yuanshen.com:8888/log HTTP/1.1
|
||||
func (c *Controller) log8888(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// POST http://log-upload-os.hoyoverse.com/crash/dataUpload HTTP/1.1
|
||||
func (c *Controller) crashDataUpload(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
271
dispatch/controller/login_controller.go
Normal file
271
dispatch/controller/login_controller.go
Normal file
@@ -0,0 +1,271 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"github.com/gin-gonic/gin"
|
||||
appConfig "hk4e/common/config"
|
||||
"hk4e/common/utils/endec"
|
||||
"hk4e/common/utils/httpclient"
|
||||
"hk4e/common/utils/random"
|
||||
"hk4e/dispatch/entity/api"
|
||||
"hk4e/dispatch/entity/db"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type SdkUserLoginReq struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
|
||||
type SdkUserLoginRsp struct {
|
||||
Code int32 `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
AccessToken string `json:"access_token"`
|
||||
RefreshToken string `json:"refresh_token"`
|
||||
Data struct {
|
||||
Uid int32 `json:"uid"`
|
||||
Username string `json:"username"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
func (c *Controller) apiLogin(context *gin.Context) {
|
||||
requestData := new(api.LoginAccountRequestJson)
|
||||
err := context.ShouldBindJSON(requestData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse LoginAccountRequestJson error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
encPwdData, err := base64.StdEncoding.DecodeString(requestData.Password)
|
||||
if err != nil {
|
||||
logger.LOG.Error("decode password enc data error: %v", err)
|
||||
return
|
||||
}
|
||||
pwdPrivKey, err := endec.RsaParsePrivKey(c.pwdRsaKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa key error: %v", err)
|
||||
return
|
||||
}
|
||||
pwdDecData, err := endec.RsaDecrypt(encPwdData, pwdPrivKey)
|
||||
useAtAtMode := false
|
||||
if err != nil {
|
||||
logger.LOG.Debug("rsa dec error: %v", err)
|
||||
logger.LOG.Debug("password rsa dec fail, fallback to @@ mode")
|
||||
useAtAtMode = true
|
||||
} else {
|
||||
logger.LOG.Debug("password dec: %v", string(pwdDecData))
|
||||
useAtAtMode = false
|
||||
}
|
||||
|
||||
responseData := api.NewLoginResult()
|
||||
|
||||
var username string
|
||||
var password string
|
||||
if useAtAtMode {
|
||||
// 账号格式检查 用户名6-20字符 密码8-20字符 用户名和密码公用account字段 第一次出现的@@视为分割标识 username@@password
|
||||
if len(requestData.Account) > 20+20+2 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名或密码长度超限"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
if !strings.Contains(requestData.Account, "@@") {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名同密码均填写到用户名输入框,填写格式为:用户名@@密码,密码输入框填写任意字符均可"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
atIndex := strings.Index(requestData.Account, "@@")
|
||||
username = requestData.Account[:atIndex]
|
||||
password = requestData.Account[atIndex+2:]
|
||||
} else {
|
||||
username = requestData.Account
|
||||
password = string(pwdDecData)
|
||||
}
|
||||
|
||||
if len(username) < 6 || len(username) > 20 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名为6-20位字符"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
if len(password) < 8 || len(password) > 20 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "密码为8-20位字符"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
ok, err := regexp.MatchString("^[a-zA-Z0-9]{6,20}$", username)
|
||||
if err != nil || !ok {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名只能包含大小写字母和数字"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
// SDK账号登陆
|
||||
sdkUserLoginRsp, err := httpclient.Post[SdkUserLoginRsp](appConfig.CONF.Hk4e.LoginSdkUrl, &SdkUserLoginReq{
|
||||
Username: username,
|
||||
Password: password,
|
||||
}, "")
|
||||
// TODO 测试账号
|
||||
{
|
||||
sdkUserLoginRsp = &SdkUserLoginRsp{
|
||||
Code: 0,
|
||||
Msg: "",
|
||||
AccessToken: "",
|
||||
RefreshToken: "",
|
||||
Data: struct {
|
||||
Uid int32 `json:"uid"`
|
||||
Username string `json:"username"`
|
||||
}{
|
||||
Uid: 267042405,
|
||||
Username: "FlourishingWorld",
|
||||
},
|
||||
}
|
||||
err = nil
|
||||
}
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-1"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
if sdkUserLoginRsp.Code != 0 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = sdkUserLoginRsp.Msg
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
// 登录成功
|
||||
account, err := c.dao.QueryAccountByField("username", username)
|
||||
if err != nil {
|
||||
logger.LOG.Error("query account from db error: %v", err)
|
||||
return
|
||||
}
|
||||
if account == nil {
|
||||
// 注册一个原神account
|
||||
playerID, err := c.dao.GetNextYuanShenUid()
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-2"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
regAccount := &db.Account{
|
||||
Uid: uint64(sdkUserLoginRsp.Data.Uid),
|
||||
Username: username,
|
||||
PlayerID: playerID,
|
||||
Token: base64.StdEncoding.EncodeToString(random.GetRandomByte(24)),
|
||||
ComboToken: "",
|
||||
}
|
||||
_, err = c.dao.InsertAccount(regAccount)
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-3"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.Account.Uid = strconv.FormatInt(int64(regAccount.Uid), 10)
|
||||
responseData.Data.Account.Token = regAccount.Token
|
||||
responseData.Data.Account.Email = regAccount.Username
|
||||
} else {
|
||||
// 生产新的token
|
||||
account.Token = base64.StdEncoding.EncodeToString(random.GetRandomByte(24))
|
||||
_, err := c.dao.UpdateAccountFieldByFieldName("uid", account.Uid, "token", account.Token)
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-4"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.Account.Uid = strconv.FormatInt(int64(account.Uid), 10)
|
||||
responseData.Data.Account.Token = account.Token
|
||||
responseData.Data.Account.Email = account.Username
|
||||
}
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
}
|
||||
|
||||
func (c *Controller) apiVerify(context *gin.Context) {
|
||||
requestData := new(api.LoginTokenRequest)
|
||||
err := context.ShouldBindJSON(requestData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse LoginTokenRequest error: %v", err)
|
||||
return
|
||||
}
|
||||
uid, err := strconv.ParseInt(requestData.Uid, 10, 64)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse uid error: %v", err)
|
||||
return
|
||||
}
|
||||
account, err := c.dao.QueryAccountByField("uid", uid)
|
||||
if err != nil {
|
||||
logger.LOG.Error("query account from db error: %v", err)
|
||||
return
|
||||
}
|
||||
responseData := api.NewLoginResult()
|
||||
if account == nil || account.Token != requestData.Token {
|
||||
responseData.Retcode = -111
|
||||
responseData.Message = "账号本地缓存信息错误"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.Account.Uid = requestData.Uid
|
||||
responseData.Data.Account.Token = requestData.Token
|
||||
responseData.Data.Account.Email = account.Username
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
}
|
||||
|
||||
func (c *Controller) v2Login(context *gin.Context) {
|
||||
requestData := new(api.ComboTokenReq)
|
||||
err := context.ShouldBindJSON(requestData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse ComboTokenReq error: %v", err)
|
||||
return
|
||||
}
|
||||
data := requestData.Data
|
||||
if len(data) == 0 {
|
||||
logger.LOG.Error("requestData.Data len == 0")
|
||||
return
|
||||
}
|
||||
loginData := new(api.LoginTokenData)
|
||||
err = json.Unmarshal([]byte(data), loginData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("Unmarshal LoginTokenData error: %v", err)
|
||||
return
|
||||
}
|
||||
uid, err := strconv.ParseInt(loginData.Uid, 10, 64)
|
||||
if err != nil {
|
||||
logger.LOG.Error("ParseInt uid error: %v", err)
|
||||
return
|
||||
}
|
||||
responseData := api.NewComboTokenRes()
|
||||
account, err := c.dao.QueryAccountByField("uid", uid)
|
||||
if account == nil || account.Token != loginData.Token {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "token错误"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
// 生成新的comboToken
|
||||
account.ComboToken = random.GetRandomByteHexStr(20)
|
||||
_, err = c.dao.UpdateAccountFieldByFieldName("uid", account.Uid, "comboToken", account.ComboToken)
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-1"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.OpenID = loginData.Uid
|
||||
responseData.Data.ComboID = "0"
|
||||
responseData.Data.ComboToken = account.ComboToken
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
}
|
||||
Reference in New Issue
Block a user