From 731b9857c1fe4b6d63a7ba68e08ee9c16f27dea0 Mon Sep 17 00:00:00 2001 From: "DESKTOP-45ANQ2C\\unis" <121212121@qq.com> Date: Thu, 12 Dec 2024 14:04:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=91=E9=97=B2=E5=B9=B3=E5=8F=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/constant.go | 2 ++ protocol/login/login.proto | 2 +- worldsrv/action_login.go | 51 +++++++++++++++++++++++++++---------- worldsrv/task_login.go | 22 ++++++++-------- worldsrv/trascate_webapi.go | 3 ++- 5 files changed, 55 insertions(+), 25 deletions(-) diff --git a/common/constant.go b/common/constant.go index f248e24..caa9e4b 100644 --- a/common/constant.go +++ b/common/constant.go @@ -328,6 +328,8 @@ const ( GainWayGuide2 = 117 // 竞技馆引导奖励 GainWayCompound = 118 // 道具合成消耗 GainWayCompoundGain = 119 // 道具合成获得 + GainWayPlatformIn = 120 // 平台上分 + GainWayPlatformOut = 121 // 平台下分 ) // 后台选择 金币变化类型 的充值 类型id号起始 diff --git a/protocol/login/login.proto b/protocol/login/login.proto index 9f6612d..adbe38a 100644 --- a/protocol/login/login.proto +++ b/protocol/login/login.proto @@ -64,7 +64,7 @@ message CSLogin { int32 InviterId = 8; //邀请人ID int32 ApkVer = 9; //apk版本号 int32 ResVer = 10; //资源版本号 - int32 LoginType = 11; //登录类型 0:游客登录 1:帐号登录 2:手机号登录 6:谷歌,facebook + int32 LoginType = 11; //登录类型 0:游客登录 1:帐号登录 2:手机号登录 6:谷歌,facebook 7: 平台token登录 string PlatformTag = 12;//android包名或者ios标记 string DeviceOs = 13; //系统android,ios,windows string Promoter = 14; //推广员 diff --git a/worldsrv/action_login.go b/worldsrv/action_login.go index 883428a..1b65558 100644 --- a/worldsrv/action_login.go +++ b/worldsrv/action_login.go @@ -4,7 +4,9 @@ import ( "crypto/md5" "encoding/hex" "fmt" + "github.com/golang-jwt/jwt/v4" "io" + "mongo.games.com/game/webapi" "strconv" "time" @@ -72,7 +74,19 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf s.Send(int(login_proto.GatePacketID_PACKET_SS_DICONNECT), ssDis) } - if csl.GetUsername() == "" || csl.GetPassword() == "" { + claims, err := webapi.ParseJwtWithClaims([]byte(common.Config.AppId), csl.Token) + if err != nil { + return nil + } + + logger.Logger.Tracef("(this *CSLoginHandler) Process ParseJwtWithClaims: claims:%v", claims.(jwt.MapClaims)) + + username := (claims.(jwt.MapClaims))["Username"].(string) + if csl.GetLoginType() == common.LoginTypePlatformToken { + csl.Username = username + } + + if (csl.GetUsername() == "" || csl.GetPassword() == "") && csl.GetLoginType() != common.LoginTypePlatformToken { sendSCLogin(login_proto.OpResultCode_OPRC_Error) sendSCDisconnect(common.KickReason_Freeze) return nil @@ -123,7 +137,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf h := md5.New() io.WriteString(h, raw) hashsum := hex.EncodeToString(h.Sum(nil)) - if hashsum != csl.GetSign() { + if hashsum != csl.GetSign() && csl.GetLoginType() != common.LoginTypePlatformToken { logger.Logger.Tracef("ClientSessionAttribute_State hashsum not fit!!! get:%v expect:%v rawstr:%v", csl.GetSign(), hashsum, raw) sendSCLogin(login_proto.OpResultCode_OPRC_Error) sendSCDisconnect(common.KickReason_CheckCodeErr) @@ -200,17 +214,17 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf } // 玩家是否有在登录的连接 - if LoginStateMgrSington.IsLogining(csl.GetUsername(), csl.GetPlatform(), tagkey) { + if LoginStateMgrSington.IsLogining(username, csl.GetPlatform(), tagkey) { logger.Logger.Warnf("CSLoginHandler logining (%v) disconnect current(%v) ", csl.GetUsername(), sid) sendSCDisconnect(common.KickReason_Logining) // 登录中重复登录会被断开连接 return nil } // 玩家已经登录完成并且在游戏中,断开当前连接 - ls := LoginStateMgrSington.GetLoginStateByName(UserKey(csl.GetUsername(), csl.GetPlatform(), tagkey)) + ls := LoginStateMgrSington.GetLoginStateByName(UserKey(username, csl.GetPlatform(), tagkey)) if ls != nil && ls.acc != nil { // lss 其它连接 - lss := LoginStateMgrSington.LoginFinish(csl.GetUsername(), csl.GetPlatform(), sid, ls.acc, tagkey) + lss := LoginStateMgrSington.LoginFinish(username, csl.GetPlatform(), sid, ls.acc, tagkey) player := PlayerMgrSington.GetPlayerBySnId(ls.acc.SnId) waitMatch := false if player != nil { @@ -229,7 +243,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf ResVer: csl.GetResVer(), InviterId: csl.GetInviterId(), PromoterTree: csl.GetPromoterTree(), - UserName: csl.GetUsername(), + UserName: username, PlatformTag: csl.GetPlatformTag(), Promoter: csl.GetPromoter(), Sid: sid, @@ -238,7 +252,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf } // 玩家开始登录 - if LoginStateMgrSington.StartLogin(csl.GetUsername(), csl.GetPlatform(), sid, s, clog, tagkey) { + if LoginStateMgrSington.StartLogin(username, csl.GetPlatform(), sid, s, clog, tagkey) { tl := &TaskLogin{CSLogin: csl, Session: s, Sid: sid, BackupPromoter: backupPromoter, tagkey: tagkey, codeValid: codeValid} t := task.New(nil, tl, tl, "TaskLogin") if b := t.StartByExecutor(csl.GetUsername()); !b { @@ -250,8 +264,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf // 用缓存信息做登录,有account // 根据StartLogin代码,这里ls.acc一定不为nil - // 验证token - ls = LoginStateMgrSington.GetLoginStateByName(UserKey(csl.GetUsername(), csl.GetPlatform(), tagkey)) + ls = LoginStateMgrSington.GetLoginStateByName(UserKey(username, csl.GetPlatform(), tagkey)) if ls != nil { acc := ls.acc // 账号冻结 @@ -266,7 +279,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf pwdIsErr := true switch csl.GetLoginType() { case common.LoginTypeGuest: //游客登录 - if acc.UserName == csl.GetUsername() && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey { + if acc.UserName == username && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey { raw := fmt.Sprintf("%v%v%v", acc.PassWord, common.GetAppId(), csl.GetTimeStamp()) h := md5.New() io.WriteString(h, raw) @@ -278,7 +291,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf } } case common.LoginTypeAccount: //帐号登录 - if acc.UserName == csl.GetUsername() && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey { + if acc.UserName == username && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey { // 用户密码 userPwd := common.GetRawPassword(acc.TelPassWord, csl.GetTimeStamp()) if userPwd != csl.GetPassword() { @@ -294,7 +307,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf } } case common.LoginTypeTelCode: // 手机验证码登录 - if acc.Tel == csl.GetUsername() && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey { + if acc.Tel == username && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey { if codeValid { // 更新密码 raw := fmt.Sprintf("%v%v", bson.NewObjectId().Hex(), common.GetAppId()) @@ -325,6 +338,18 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf } } } + case common.LoginTypePlatformToken: + // 验证token + pwdIsErr = true + + //expire := (claims.(jwt.MapClaims))["Exp"].(int64) + ////timeStamp := (claims.(jwt.MapClaims))["Timestamp"] + // + //if username == username && expire <= time.Now().Add(time.Hour*24).Unix() { + // pwdIsErr = true + //} else { + // pwdIsErr = false + //} } //密码错误 @@ -349,7 +374,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf SCLogin(s, sid, csl, acc, login_proto.OpResultCode_OPRC_Sucess, false) // 标记当前玩家登录成功,断开其它连接 - lss := LoginStateMgrSington.LoginFinish(csl.GetUsername(), csl.GetPlatform(), sid, acc, tagkey) + lss := LoginStateMgrSington.LoginFinish(username, csl.GetPlatform(), sid, acc, tagkey) if len(lss) != 0 { for k, ls := range lss { ssDis := &login_proto.SSDisconnect{ diff --git a/worldsrv/task_login.go b/worldsrv/task_login.go index d5cf8eb..0d6a8d4 100644 --- a/worldsrv/task_login.go +++ b/worldsrv/task_login.go @@ -4,7 +4,9 @@ import ( "crypto/md5" "encoding/hex" "fmt" + "github.com/golang-jwt/jwt/v4" "io" + "mongo.games.com/game/webapi" "strconv" "strings" "time" @@ -39,20 +41,20 @@ type TaskLogin struct { func (t *TaskLogin) Call(o *basic.Object) interface{} { var playerData *model.PlayerData - // token验证 - //claims, err := webapi.ParseJwtWithClaims([]byte(common.Config.AppId), t.Token) - //if err != nil { - // return nil - //} - // - //logger.Logger.Tracef("TaskLogin ParseJwtWithClaims: claims:%v", claims.(jwt.MapClaims)) + //token验证 + claims, err := webapi.ParseJwtWithClaims([]byte(common.Config.AppId), t.Token) + if err != nil { + return nil + } - //username := (claims.(jwt.MapClaims))["Username"] + logger.Logger.Tracef("TaskLogin ParseJwtWithClaims: claims:%v", claims.(jwt.MapClaims)) + + username := (claims.(jwt.MapClaims))["Username"].(string) //expire := (claims.(jwt.MapClaims))["Exp"] //timeStamp := (claims.(jwt.MapClaims))["Timestamp"] - acc, retCode := model.AccountIsExist(t.GetUsername(), t.GetUsername(), t.GetPassword(), t.GetPlatform(), - t.GetTimeStamp(), t.GetLoginType(), t.tagkey, false, t.codeValid) + acc, retCode := model.AccountIsExist(username, username, t.GetPassword(), t.GetPlatform(), + t.GetTimeStamp(), common.LoginTypePlatformToken, t.tagkey, false, t.codeValid) switch retCode { case common.LoginOk: diff --git a/worldsrv/trascate_webapi.go b/worldsrv/trascate_webapi.go index 7e54b5a..965861e 100644 --- a/worldsrv/trascate_webapi.go +++ b/worldsrv/trascate_webapi.go @@ -2910,7 +2910,8 @@ func init() { return common.ResponseTag_ParamError, jsonDataRsp } - pack.Data.Url = fmt.Sprintf("%s?access_token=%s", model.GameParamData.PlatformClientAddr, tokenStr) + pack.Data.Url = fmt.Sprintf("%s?login_token=%s", model.GameParamData.PlatformClientAddr, tokenStr) + logger.Logger.Tracef("/api/platform/createUser pack.Data.Url : %v", pack.Data.Url) task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { acc, retCode := model.AccountIsExist(AccountInfo.Username, "", "", "1", AccountInfo.Timestamp,