diff --git a/common/constant.go b/common/constant.go index 4d6d278..f248e24 100644 --- a/common/constant.go +++ b/common/constant.go @@ -522,11 +522,12 @@ const ( ) const ( - LoginTypeGuest = 0 // 游客登录 - LoginTypeAccount = 1 // 账号登录 - LoginTypeTelCode = 2 // 手机号验证码登录 - LoginTypeTelegram = 5 // telegram登录 - LoginTypeGoogle = 6 // google,facebook 登录 + LoginTypeGuest = 0 // 游客登录 + LoginTypeAccount = 1 // 账号登录 + LoginTypeTelCode = 2 // 手机号验证码登录 + LoginTypeTelegram = 5 // telegram登录 + LoginTypeGoogle = 6 // google,facebook 登录 + LoginTypePlatformToken = 7 // 平台token 登录 RegisterTypeTel = 3 // 手机号注册 RegisterTypeName = 4 // 账号注册 diff --git a/dbproxy/svc/u_account.go b/dbproxy/svc/u_account.go index 1020a12..c079465 100644 --- a/dbproxy/svc/u_account.go +++ b/dbproxy/svc/u_account.go @@ -239,6 +239,16 @@ func (svc *AccountSvc) AccountIsExist(args *model.AccIsExistArg, ret *model.AccR ret.Tag = common.RegisterExist return nil } + case common.LoginTypePlatformToken: + //平台token注册 + err := caccounts.Find(bson.M{"username": args.Username, "tagkey": args.TagKey}).One(acc) + if err != nil { + if errors.Is(err, mgo.ErrNotFound) { + ret.Tag = common.LoginNew + return nil + } + return err + } default: ret.Tag = common.LoginTypeNoExist diff --git a/mgrsrv/api/webapi_worldsrv.go b/mgrsrv/api/webapi_worldsrv.go index cc232e2..cf93588 100644 --- a/mgrsrv/api/webapi_worldsrv.go +++ b/mgrsrv/api/webapi_worldsrv.go @@ -162,7 +162,7 @@ func PlatformSrvApi(rw http.ResponseWriter, req *http.Request) { realSign := webapi.MD5Params(params, PLATFORMAPPKEY, "sign") sign := params["sign"] - if realSign != sign { + if realSign != sign && !common.Config.IsDevMode { logger.Logger.Info(req.RemoteAddr, " srvCtrlMain sign error: expect ", realSign, " ; but get ", sign, " raw=", params) webApiResponse(rw, nil /*map[string]interface{}{webapi.RESPONSE_STATE: webapi.STATE_ERR, webapi.RESPONSE_ERRMSG: "Sign error!"}*/) return @@ -224,11 +224,10 @@ func PlatformSrvApi(rw http.ResponseWriter, req *http.Request) { atomic.StoreInt64(&stats.MaxRuningTime, ps) } } - result, err := json.Marshal(rep) - if err == nil { - log := model.NewAPILog(req.URL.Path, req.URL.RawQuery, string(data[:]), req.RemoteAddr, string(result[:]), startTime, ps) - mq.Write(log) - } + + log := model.NewAPILog(req.URL.Path, req.URL.RawQuery, string(data[:]), req.RemoteAddr, string(rep[:]), startTime, ps) + mq.Write(log) + return } diff --git a/model/gameparam.go b/model/gameparam.go index f7b297d..62fb660 100644 --- a/model/gameparam.go +++ b/model/gameparam.go @@ -93,6 +93,7 @@ type GameParam struct { ClientVersion int32 // 客户端版本号 ClientVersionChannel []string // 客户端版本号包渠道 SwapShopUrl string // 交换商城地址 + PlatformClientAddr string // 休闲平台客户端地址 } var GameParamPath = "../data/gameparam.json" diff --git a/webapi/api.go b/webapi/api.go index ebc76b7..ef83d86 100644 --- a/webapi/api.go +++ b/webapi/api.go @@ -5,6 +5,7 @@ import ( "crypto/tls" "encoding/json" "fmt" + "github.com/golang-jwt/jwt/v4" "io" "net" "net/http" @@ -216,3 +217,18 @@ func Stats() map[string]ApiStats { }) return stats } + +func ParseJwtWithClaims(key any, jwtStr string, options ...jwt.ParserOption) (jwt.Claims, error) { + mc := jwt.MapClaims{} + token, err := jwt.ParseWithClaims(jwtStr, mc, func(token *jwt.Token) (interface{}, error) { + return key, nil + }, options...) + if err != nil { + return nil, err + } + // 校验 Claims 对象是否有效,基于 exp(过期时间),nbf(不早于),iat(签发时间)等进行判断(如果有这些声明的话)。 + if !token.Valid { + return nil, err + } + return token.Claims, nil +} diff --git a/webapi/deprecated.go b/webapi/deprecated.go index eb6be8e..b127e9f 100644 --- a/webapi/deprecated.go +++ b/webapi/deprecated.go @@ -238,6 +238,15 @@ func ApiGetInviteLink(appId string, body proto.Message) ([]byte, error) { return postRequest(appId, "/get_invite_link", nil, body, "http", DEFAULT_TIMEOUT) } +// 平台创建账号请求 +type PlatfromCreateAccountReq struct { + Username string `json:"username"` + Channel string `json:"channel"` + Nickname string `json:"nickname"` + Avater string `json:"avater"` + Timestamp int64 `json:"timestamp"` +} + // 平台登录返回 type PlatfromGameLoginRsp struct { Code int `json:"code"` diff --git a/worldsrv/task_login.go b/worldsrv/task_login.go index cdb4f2d..d5cf8eb 100644 --- a/worldsrv/task_login.go +++ b/worldsrv/task_login.go @@ -38,10 +38,21 @@ type TaskLogin struct { // in task.Worker goroutine func (t *TaskLogin) Call(o *basic.Object) interface{} { var playerData *model.PlayerData - acc, retCode := model.AccountIsExist(t.GetUsername(), t.GetUsername(), t.GetPassword(), t.GetPlatform(), - t.GetTimeStamp(), t.GetLoginType(), t.tagkey, false, t.codeValid) // 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)) + + //username := (claims.(jwt.MapClaims))["Username"] + //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) switch retCode { case common.LoginOk: diff --git a/worldsrv/trascate_webapi.go b/worldsrv/trascate_webapi.go index 8c2f456..7e54b5a 100644 --- a/worldsrv/trascate_webapi.go +++ b/worldsrv/trascate_webapi.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/golang-jwt/jwt/v4" "io" "reflect" "slices" @@ -2879,24 +2880,81 @@ func init() { WebAPIHandlerMgrSingleton.RegisteWebAPIHandler("/api/platform/createUser", WebAPIHandlerWrapper( func(tNode *transact.TransNode, params []byte) (int, interface{}) { + + var AccountInfo *webapi.PlatfromCreateAccountReq + err := json.Unmarshal(params, &AccountInfo) + if err != nil { + logger.Logger.Error("Unmarshal webapi.PlatfromCreateAccountReq error:", err) + } + pack := &webapi.PlatfromGameLoginRsp{ Success: false, Code: 200, Message: "未知错误", } - pack.Data.Url = "http://192.168.31.173/web-mobile-p102/" logger.Logger.Tracef("/api/platform/createUse %v", pack) var jsonDataRsp []byte + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "Username": AccountInfo.Username, + "Platform": "1", + "Channel": AccountInfo.Channel, + "Timestamp": AccountInfo.Timestamp, + "Exp": time.Now().Add(time.Hour * 24).Unix(), + }) + tokenStr, err := token.SignedString([]byte(common.Config.AppId)) + if err != nil { + logger.Logger.Errorf("/api/platform/createUser createToken err:%v", err) + return common.ResponseTag_ParamError, jsonDataRsp + } + + pack.Data.Url = fmt.Sprintf("%s?access_token=%s", model.GameParamData.PlatformClientAddr, tokenStr) + task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { - //b, err = webapi.API_ExchangeRecord(common.GetAppId(), msg) + acc, retCode := model.AccountIsExist(AccountInfo.Username, "", "", "1", AccountInfo.Timestamp, + common.LoginTypePlatformToken, 0, false, false) + + switch retCode { + case common.LoginNew: + acc, retCode = model.InsertAccount(&model.InsertAccountParam{ + Platform: "1", + UserName: AccountInfo.Username, + ChannelId: AccountInfo.Channel, + AccountType: 0, + }) + + if retCode != common.InsertAccountOk { + return playerproto.OpResultCode_OPRC_Error + } + //生成玩家数据 + pi, tf := model.InsertPlayerData(&model.InsertPlayerDataParam{ + Plt: acc.Platform, + AccId: acc.AccountId.Hex(), + NickName: AccountInfo.Nickname, + HeadUrl: AccountInfo.Avater, + }) + + if pi == nil || tf == false { + return playerproto.OpResultCode_OPRC_Error + } + + logger.Logger.Tracef("/api/platform/createUser LoginNew success: %v", acc) + case common.LoginOk: + logger.Logger.Tracef("/api/platform/createUser LoginOk: %v", acc) + } + pack.Success = true pack.Message = "返回成功" + return nil }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { - jsonDataRsp, _ = json.Marshal(pack) + jsonDataRsp, err = json.Marshal(pack) + if err != nil { + logger.Logger.Errorf("/api/platform/createUser err: %v", err) + } tNode.TransRep.RetFiels = jsonDataRsp tNode.Resume()