Commit 8b9ba965295fc094d0bd34ac04a16a96a93ee658
1 parent
b0cb5864
Exists in
master
and in
1 other branch
refactor♻️:项目目录重构
Showing
5 changed files
with
465 additions
and
465 deletions
Show diff stats
controllers/base.go
| @@ -0,0 +1,155 @@ | @@ -0,0 +1,155 @@ | ||
| 1 | +package sdk | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/util-lx/lxalilog" | ||
| 5 | + "apigame/util/util-lx/lxbeego" | ||
| 6 | + "apigame/util/util-lx/lxredis" | ||
| 7 | + "encoding/json" | ||
| 8 | + "errors" | ||
| 9 | + "fmt" | ||
| 10 | + "strings" | ||
| 11 | + | ||
| 12 | + "github.com/astaxie/beego" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type MapSdkTokenRet struct { | ||
| 16 | + Code string `json:"code"` | ||
| 17 | + Data struct { | ||
| 18 | + Ttl int `json:"ttl"` | ||
| 19 | + } `json:"data"` | ||
| 20 | + Msg string `json:"msg"` | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +type MapSDKMemberInfo struct { | ||
| 24 | + Code string `json:"code"` | ||
| 25 | + Data struct { | ||
| 26 | + Uid int64 `json:"uid"` | ||
| 27 | + Channel string `json:"channel"` | ||
| 28 | + Scene string `json:"scene"` | ||
| 29 | + Openid string `json:"openid"` | ||
| 30 | + Unionid string `json:"unionid"` | ||
| 31 | + Nickname string `json:"nickname"` | ||
| 32 | + Headurl string `json:"headurl"` | ||
| 33 | + Sex int `json:"sex"` | ||
| 34 | + Shareuid int64 `json:"shareuid"` | ||
| 35 | + Status int `json:"status"` | ||
| 36 | + FirstLogin string `json:"first_login"` | ||
| 37 | + Logindays int `json:"logindays"` | ||
| 38 | + CreateTime int64 `json:"create_time"` | ||
| 39 | + LastloginTime int64 `json:"lastlogin_time"` | ||
| 40 | + UpdateTime int64 `json:"update_time"` | ||
| 41 | + } `json:"data"` | ||
| 42 | + Msg string `json:"msg"` | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +func ckecklocaldb(gameid string, uid int64, token string) (err error) { | ||
| 46 | + | ||
| 47 | + _redis := lxredis.LXredis{ | ||
| 48 | + Name: fmt.Sprintf("token::%s::%d", gameid, uid), | ||
| 49 | + Db: beego.AppConfig.String("redis::sdkdb"), | ||
| 50 | + Prefix: beego.AppConfig.String("redis::sdkprefix"), | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + tstr, err := _redis.GET() | ||
| 54 | + if err != nil { | ||
| 55 | + lxalilog.Errors(err, "_redis GET:") | ||
| 56 | + return | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + if tstr == "" { | ||
| 60 | + err = errors.New("tsrt") | ||
| 61 | + lxalilog.Errors(err, "tstr empty:") | ||
| 62 | + return | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + redistoken := strings.Split(tstr, "|")[0] | ||
| 66 | + if redistoken != token { | ||
| 67 | + err = errors.New("token error") | ||
| 68 | + lxalilog.Errors(err, "redistoken:", redistoken, ",token:", token) | ||
| 69 | + return | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + return | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +// 验证SDKtoken | ||
| 76 | +func CheckSdkToken(gameid string, uid int64, token string) (err error) { | ||
| 77 | + | ||
| 78 | + if uid == 99 || token == "fb0ba80fad895664c7aea7c8ce462505" { | ||
| 79 | + return | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + return ckecklocaldb(gameid, uid, token) | ||
| 83 | + | ||
| 84 | + // var ( | ||
| 85 | + // gconfig = service_config.GetGameConfigByGameID(gameid) | ||
| 86 | + // apiurl = beego.AppConfig.String("sdk::checktoken") + gconfig.Appkey | ||
| 87 | + // ) | ||
| 88 | + | ||
| 89 | + // content, httpcode, err := lurl.PostBody(apiurl, map[string]interface{}{ | ||
| 90 | + // "gameid": gameid, | ||
| 91 | + // "uid": uid, | ||
| 92 | + // "token": token, | ||
| 93 | + // }) | ||
| 94 | + | ||
| 95 | + // if err != nil { | ||
| 96 | + // lxalilog.Errors("lurl.PostBody error:", err, gameid, uid, token) | ||
| 97 | + // return | ||
| 98 | + // } | ||
| 99 | + | ||
| 100 | + // if httpcode != 200 { | ||
| 101 | + // err = errors.New("httpcode!= 200") | ||
| 102 | + // lxalilog.Errors("httpcode error:", err, gameid, uid, token, httpcode) | ||
| 103 | + // return | ||
| 104 | + // } | ||
| 105 | + | ||
| 106 | + // var ret MapSdkTokenRet | ||
| 107 | + // err = json.Unmarshal(content, &ret) | ||
| 108 | + // if err != nil { | ||
| 109 | + // lxalilog.Errors("json.Unmarshal error:", err, gameid, uid, token, string(content)) | ||
| 110 | + // return | ||
| 111 | + // } | ||
| 112 | + | ||
| 113 | + // if ret.Code != "0" { | ||
| 114 | + // err = errors.New("ret.Code != 0") | ||
| 115 | + // lxalilog.Errors(err, gameid, uid, token, string(content)) | ||
| 116 | + // return | ||
| 117 | + // } | ||
| 118 | + | ||
| 119 | + // return | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +// 获取SDK用户信息 | ||
| 123 | +func GetSdkMemberInfo(gameid string, uid int64) (member MapSDKMemberInfo, err error) { | ||
| 124 | + | ||
| 125 | + var ( | ||
| 126 | + apiurl = fmt.Sprintf("%s?gameid=%s&uid=%d", beego.AppConfig.String("sdk::getmemberinfo"), gameid, uid) | ||
| 127 | + ) | ||
| 128 | + | ||
| 129 | + content, httpcode, err := lxbeego.Get(apiurl) | ||
| 130 | + | ||
| 131 | + if err != nil { | ||
| 132 | + lxalilog.Errors("lxbeego.lxbeego error:", err, apiurl) | ||
| 133 | + return | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + if httpcode != 200 { | ||
| 137 | + err = errors.New("httpcode!= 200") | ||
| 138 | + lxalilog.Errors("httpcode error:", err, apiurl) | ||
| 139 | + return | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + err = json.Unmarshal(content, &member) | ||
| 143 | + if err != nil { | ||
| 144 | + lxalilog.Errors("json.Unmarshal error:", err, apiurl, string(content)) | ||
| 145 | + return | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + if member.Code != "0" { | ||
| 149 | + err = errors.New("ret.Code != 0") | ||
| 150 | + lxalilog.Errors(err, apiurl, string(content)) | ||
| 151 | + return | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + return | ||
| 155 | +} |
| @@ -0,0 +1,309 @@ | @@ -0,0 +1,309 @@ | ||
| 1 | +package sign | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/api-common/config" | ||
| 5 | + "apigame/middleware/sdk" | ||
| 6 | + "apigame/service/constd" | ||
| 7 | + "apigame/util/util-lx/lxalilog" | ||
| 8 | + "apigame/util/util-lx/lxarray" | ||
| 9 | + "apigame/util/util-lx/lxconv" | ||
| 10 | + "apigame/util/util-lx/lxlimit" | ||
| 11 | + "apigame/util/util-lx/lxtime" | ||
| 12 | + "encoding/json" | ||
| 13 | + "errors" | ||
| 14 | + "fmt" | ||
| 15 | + | ||
| 16 | + "sort" | ||
| 17 | + "strings" | ||
| 18 | + "unicode/utf8" | ||
| 19 | + | ||
| 20 | + "github.com/astaxie/beego/validation" | ||
| 21 | +) | ||
| 22 | + | ||
| 23 | +type MCheckConfig struct { | ||
| 24 | + CheckUrlGameID bool | ||
| 25 | + CheckToken bool | ||
| 26 | + CheckSign bool | ||
| 27 | + FunName string | ||
| 28 | + Bodys []byte | ||
| 29 | + Ip lxlimit.MFuncItem `json:"ip"` | ||
| 30 | + Kernel lxlimit.MFuncItem `json:"kernel"` | ||
| 31 | + Member lxlimit.MFuncItem `json:"member"` | ||
| 32 | + Url string `json:"url"` | ||
| 33 | + Params map[string]string `json:"params"` | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +func getTimeStamp(time_stamp interface{}) (timestamp int64) { | ||
| 37 | + if time_stamp == nil { | ||
| 38 | + return | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + tsp := "" | ||
| 42 | + | ||
| 43 | + switch tp := time_stamp.(type) { | ||
| 44 | + case string: | ||
| 45 | + tsp = fmt.Sprintf("%s", tp) | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + if tsp == "" { | ||
| 49 | + return | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + timestamp = lxconv.ParseInt64(tsp) | ||
| 53 | + lth := utf8.RuneCountInString(tsp) | ||
| 54 | + if lth > 10 { | ||
| 55 | + timestamp = timestamp / 1000 | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + return | ||
| 59 | + | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig config.MApiGameConfig, err error) { | ||
| 63 | + | ||
| 64 | + var ( | ||
| 65 | + postGameId string | ||
| 66 | + urlGameId string | ||
| 67 | + ty string | ||
| 68 | + c lxlimit.MFuncConfig | ||
| 69 | + nowtime = lxtime.NowUninx() | ||
| 70 | + time_stamp int64 | ||
| 71 | + JG = int64(2) | ||
| 72 | + ) | ||
| 73 | + | ||
| 74 | + // 检查时间戳 | ||
| 75 | + tempData := make(map[string]interface{}) | ||
| 76 | + _ = json.Unmarshal(cgg.Bodys, &tempData) | ||
| 77 | + | ||
| 78 | + time_stamp = getTimeStamp(tempData["time_stamp"]) | ||
| 79 | + if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) { | ||
| 80 | + code = constd.RECODE_REQUESTTIME_ERROR | ||
| 81 | + err = errors.New(code) | ||
| 82 | + lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys)) | ||
| 83 | + return | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + c.Ip = cgg.Ip | ||
| 87 | + c.Kernel = cgg.Kernel | ||
| 88 | + c.Params = cgg.Params | ||
| 89 | + c.Url = cgg.Url | ||
| 90 | + c.BodyBy = cgg.Bodys | ||
| 91 | + if cgg.FunName == "" { | ||
| 92 | + c.FunName = c.Url | ||
| 93 | + } | ||
| 94 | + c.Member = cgg.Member | ||
| 95 | + | ||
| 96 | + for k, v := range c.Params { | ||
| 97 | + if k == ":gameid" { | ||
| 98 | + urlGameId = v | ||
| 99 | + } | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + if cgg.CheckUrlGameID && urlGameId == "" { | ||
| 103 | + code = constd.RECODE_PARAMERROR | ||
| 104 | + err = errors.New(code) | ||
| 105 | + lxalilog.Errors("urlGameid error:") | ||
| 106 | + return | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + postGameId, ty = lxlimit.CheckLimit(c) | ||
| 110 | + | ||
| 111 | + if cgg.CheckUrlGameID && postGameId != urlGameId { | ||
| 112 | + code = constd.RECODE_PARAMERROR | ||
| 113 | + err = errors.New(code) | ||
| 114 | + lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata) | ||
| 115 | + return | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + if ty != "" { | ||
| 119 | + code = constd.RECODE_REQUESTXIANLIU_ERROR | ||
| 120 | + err = errors.New(ty) | ||
| 121 | + return | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + err = json.Unmarshal(cgg.Bodys, &postdata) | ||
| 125 | + if err != nil { | ||
| 126 | + code = constd.RECODE_PARAMERROR | ||
| 127 | + lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys)) | ||
| 128 | + return | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + valid := validation.Validation{} | ||
| 132 | + | ||
| 133 | + var b bool | ||
| 134 | + | ||
| 135 | + b, err = valid.Valid(postdata) | ||
| 136 | + if err != nil { | ||
| 137 | + code = constd.RECODE_PARAMERROR | ||
| 138 | + lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) | ||
| 139 | + return | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + if !b { | ||
| 143 | + code = constd.RECODE_PARAMERROR | ||
| 144 | + err = errors.New(code) | ||
| 145 | + lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) | ||
| 146 | + return | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + if cgg.CheckSign { | ||
| 150 | + code, gameconfig, err = CheckSign(postdata, cgg.CheckToken) | ||
| 151 | + if err != nil { | ||
| 152 | + return | ||
| 153 | + } | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + return | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +// Check 检查签名 | ||
| 160 | +func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (code string, err error) { | ||
| 161 | + | ||
| 162 | + err = json.Unmarshal(req, &postdata) | ||
| 163 | + if err != nil { | ||
| 164 | + code = constd.RECODE_PARAMERROR | ||
| 165 | + lxalilog.Errors("json.Unmarshal error:", err, string(req)) | ||
| 166 | + return | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + valid := validation.Validation{} | ||
| 170 | + | ||
| 171 | + var b bool | ||
| 172 | + | ||
| 173 | + b, err = valid.Valid(postdata) | ||
| 174 | + if err != nil { | ||
| 175 | + code = constd.RECODE_PARAMERROR | ||
| 176 | + lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) | ||
| 177 | + return | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + if !b { | ||
| 181 | + code = constd.RECODE_PARAMERROR | ||
| 182 | + err = errors.New(code) | ||
| 183 | + lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) | ||
| 184 | + return | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + if checkSign { | ||
| 188 | + code, _, err = CheckSign(postdata, checkToken) | ||
| 189 | + if err != nil { | ||
| 190 | + return | ||
| 191 | + } | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + return | ||
| 195 | +} | ||
| 196 | + | ||
| 197 | +// CheckSign 校验签名 | ||
| 198 | +func CheckSign(data interface{}, checkToken bool) (code string, gameconfig config.MApiGameConfig, err error) { | ||
| 199 | + | ||
| 200 | + var ( | ||
| 201 | + logstr string | ||
| 202 | + ) | ||
| 203 | + | ||
| 204 | + jsonBody, _ := json.Marshal(data) | ||
| 205 | + | ||
| 206 | + logstr += string(jsonBody) | ||
| 207 | + | ||
| 208 | + var newdata = make(map[string]interface{}) | ||
| 209 | + | ||
| 210 | + err = json.Unmarshal(jsonBody, &newdata) | ||
| 211 | + if err != nil { | ||
| 212 | + code = constd.RECODE_SIGNERROR | ||
| 213 | + lxalilog.Errors("json.Unmarshal error:", err) | ||
| 214 | + return | ||
| 215 | + } | ||
| 216 | + | ||
| 217 | + if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" { | ||
| 218 | + code = constd.RECODE_SIGNERROR | ||
| 219 | + err = errors.New("签名错误,参数错误" + logstr) | ||
| 220 | + lxalilog.Errors(err) | ||
| 221 | + return | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | + gameid := newdata["gameid"].(string) | ||
| 225 | + | ||
| 226 | + gameconfig, err = config.GetApiGameConfig(gameid) | ||
| 227 | + if err != nil { | ||
| 228 | + lxalilog.Errors(err) | ||
| 229 | + return | ||
| 230 | + } | ||
| 231 | + | ||
| 232 | + if newdata["sign"].(string) == "fb0ba80fad895664c7aea7c8ce462505" { | ||
| 233 | + return | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + appkey := gameconfig.Appkey | ||
| 237 | + | ||
| 238 | + if appkey == "" { | ||
| 239 | + code = constd.RECODE_SIGNERROR | ||
| 240 | + err = errors.New("签名错误,参数错误" + gameid + "no appkey") | ||
| 241 | + lxalilog.Errors(err) | ||
| 242 | + return | ||
| 243 | + } | ||
| 244 | + | ||
| 245 | + sign := newdata["sign"] | ||
| 246 | + | ||
| 247 | + sortdata := make([]string, 0, len(newdata)) | ||
| 248 | + | ||
| 249 | + fiterword := "and|exec|insert|select|delete|update|count|master|truncate|declare|char(|mid(|chr(|'" | ||
| 250 | + fiterwords := strings.Split(fiterword, "|") | ||
| 251 | + var fiterkey []interface{} | ||
| 252 | + | ||
| 253 | + for k, v := range newdata { | ||
| 254 | + newv := lxconv.InterfaceToStr(v) | ||
| 255 | + | ||
| 256 | + if b := lxarray.InArray(newv, fiterwords); b { | ||
| 257 | + fiterkey = append(fiterkey, k) | ||
| 258 | + } | ||
| 259 | + if newv != "" && newv != "0" && k != "sign" && k != "ver" && k != "dev" && k != "dever" && k != "pkv" { | ||
| 260 | + sortdata = append(sortdata, k) | ||
| 261 | + } | ||
| 262 | + } | ||
| 263 | + | ||
| 264 | + if len(fiterkey) > 0 { | ||
| 265 | + code = constd.RECODE_WEIXINAZIFU_ERROR | ||
| 266 | + err = errors.New("fiterkey error" + logstr) | ||
| 267 | + lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata)) | ||
| 268 | + return | ||
| 269 | + } | ||
| 270 | + | ||
| 271 | + sort.Strings(sortdata) | ||
| 272 | + valstr := "" | ||
| 273 | + for _, k := range sortdata { // 先下标,再数值 | ||
| 274 | + v := lxconv.InterfaceToStr(newdata[k]) | ||
| 275 | + valstr += k + "=" + v | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + valstr += appkey | ||
| 279 | + | ||
| 280 | + logstr += ",valstr:(" + valstr + ")" | ||
| 281 | + | ||
| 282 | + md5key := strings.ToLower(lxconv.EncryMD5(valstr)) | ||
| 283 | + | ||
| 284 | + if md5key != sign { | ||
| 285 | + code = constd.RECODE_SIGNERROR | ||
| 286 | + err = errors.New(code) | ||
| 287 | + lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata)) | ||
| 288 | + return | ||
| 289 | + } | ||
| 290 | + | ||
| 291 | + if checkToken { | ||
| 292 | + | ||
| 293 | + if newdata["uid"] == nil || newdata["token"] == nil { | ||
| 294 | + code = constd.RECODE_PARAMERROR | ||
| 295 | + err = errors.New(code) | ||
| 296 | + lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata)) | ||
| 297 | + return | ||
| 298 | + } | ||
| 299 | + | ||
| 300 | + err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"])) | ||
| 301 | + if err != nil { | ||
| 302 | + code = constd.RECODE_LOGINCHECK_ERROR | ||
| 303 | + return | ||
| 304 | + } | ||
| 305 | + | ||
| 306 | + } | ||
| 307 | + | ||
| 308 | + return | ||
| 309 | +} |
sdk/sdk.go
| @@ -1,155 +0,0 @@ | @@ -1,155 +0,0 @@ | ||
| 1 | -package sdk | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/util/util-lx/lxalilog" | ||
| 5 | - "apigame/util/util-lx/lxbeego" | ||
| 6 | - "apigame/util/util-lx/lxredis" | ||
| 7 | - "encoding/json" | ||
| 8 | - "errors" | ||
| 9 | - "fmt" | ||
| 10 | - "strings" | ||
| 11 | - | ||
| 12 | - "github.com/astaxie/beego" | ||
| 13 | -) | ||
| 14 | - | ||
| 15 | -type MapSdkTokenRet struct { | ||
| 16 | - Code string `json:"code"` | ||
| 17 | - Data struct { | ||
| 18 | - Ttl int `json:"ttl"` | ||
| 19 | - } `json:"data"` | ||
| 20 | - Msg string `json:"msg"` | ||
| 21 | -} | ||
| 22 | - | ||
| 23 | -type MapSDKMemberInfo struct { | ||
| 24 | - Code string `json:"code"` | ||
| 25 | - Data struct { | ||
| 26 | - Uid int64 `json:"uid"` | ||
| 27 | - Channel string `json:"channel"` | ||
| 28 | - Scene string `json:"scene"` | ||
| 29 | - Openid string `json:"openid"` | ||
| 30 | - Unionid string `json:"unionid"` | ||
| 31 | - Nickname string `json:"nickname"` | ||
| 32 | - Headurl string `json:"headurl"` | ||
| 33 | - Sex int `json:"sex"` | ||
| 34 | - Shareuid int64 `json:"shareuid"` | ||
| 35 | - Status int `json:"status"` | ||
| 36 | - FirstLogin string `json:"first_login"` | ||
| 37 | - Logindays int `json:"logindays"` | ||
| 38 | - CreateTime int64 `json:"create_time"` | ||
| 39 | - LastloginTime int64 `json:"lastlogin_time"` | ||
| 40 | - UpdateTime int64 `json:"update_time"` | ||
| 41 | - } `json:"data"` | ||
| 42 | - Msg string `json:"msg"` | ||
| 43 | -} | ||
| 44 | - | ||
| 45 | -func ckecklocaldb(gameid string, uid int64, token string) (err error) { | ||
| 46 | - | ||
| 47 | - _redis := lxredis.LXredis{ | ||
| 48 | - Name: fmt.Sprintf("token::%s::%d", gameid, uid), | ||
| 49 | - Db: beego.AppConfig.String("redis::sdkdb"), | ||
| 50 | - Prefix: beego.AppConfig.String("redis::sdkprefix"), | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - tstr, err := _redis.GET() | ||
| 54 | - if err != nil { | ||
| 55 | - lxalilog.Errors(err, "_redis GET:") | ||
| 56 | - return | ||
| 57 | - } | ||
| 58 | - | ||
| 59 | - if tstr == "" { | ||
| 60 | - err = errors.New("tsrt") | ||
| 61 | - lxalilog.Errors(err, "tstr empty:") | ||
| 62 | - return | ||
| 63 | - } | ||
| 64 | - | ||
| 65 | - redistoken := strings.Split(tstr, "|")[0] | ||
| 66 | - if redistoken != token { | ||
| 67 | - err = errors.New("token error") | ||
| 68 | - lxalilog.Errors(err, "redistoken:", redistoken, ",token:", token) | ||
| 69 | - return | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - return | ||
| 73 | -} | ||
| 74 | - | ||
| 75 | -// 验证SDKtoken | ||
| 76 | -func CheckSdkToken(gameid string, uid int64, token string) (err error) { | ||
| 77 | - | ||
| 78 | - if uid == 99 || token == "fb0ba80fad895664c7aea7c8ce462505" { | ||
| 79 | - return | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | - return ckecklocaldb(gameid, uid, token) | ||
| 83 | - | ||
| 84 | - // var ( | ||
| 85 | - // gconfig = service_config.GetGameConfigByGameID(gameid) | ||
| 86 | - // apiurl = beego.AppConfig.String("sdk::checktoken") + gconfig.Appkey | ||
| 87 | - // ) | ||
| 88 | - | ||
| 89 | - // content, httpcode, err := lurl.PostBody(apiurl, map[string]interface{}{ | ||
| 90 | - // "gameid": gameid, | ||
| 91 | - // "uid": uid, | ||
| 92 | - // "token": token, | ||
| 93 | - // }) | ||
| 94 | - | ||
| 95 | - // if err != nil { | ||
| 96 | - // lxalilog.Errors("lurl.PostBody error:", err, gameid, uid, token) | ||
| 97 | - // return | ||
| 98 | - // } | ||
| 99 | - | ||
| 100 | - // if httpcode != 200 { | ||
| 101 | - // err = errors.New("httpcode!= 200") | ||
| 102 | - // lxalilog.Errors("httpcode error:", err, gameid, uid, token, httpcode) | ||
| 103 | - // return | ||
| 104 | - // } | ||
| 105 | - | ||
| 106 | - // var ret MapSdkTokenRet | ||
| 107 | - // err = json.Unmarshal(content, &ret) | ||
| 108 | - // if err != nil { | ||
| 109 | - // lxalilog.Errors("json.Unmarshal error:", err, gameid, uid, token, string(content)) | ||
| 110 | - // return | ||
| 111 | - // } | ||
| 112 | - | ||
| 113 | - // if ret.Code != "0" { | ||
| 114 | - // err = errors.New("ret.Code != 0") | ||
| 115 | - // lxalilog.Errors(err, gameid, uid, token, string(content)) | ||
| 116 | - // return | ||
| 117 | - // } | ||
| 118 | - | ||
| 119 | - // return | ||
| 120 | -} | ||
| 121 | - | ||
| 122 | -// 获取SDK用户信息 | ||
| 123 | -func GetSdkMemberInfo(gameid string, uid int64) (member MapSDKMemberInfo, err error) { | ||
| 124 | - | ||
| 125 | - var ( | ||
| 126 | - apiurl = fmt.Sprintf("%s?gameid=%s&uid=%d", beego.AppConfig.String("sdk::getmemberinfo"), gameid, uid) | ||
| 127 | - ) | ||
| 128 | - | ||
| 129 | - content, httpcode, err := lxbeego.Get(apiurl) | ||
| 130 | - | ||
| 131 | - if err != nil { | ||
| 132 | - lxalilog.Errors("lxbeego.lxbeego error:", err, apiurl) | ||
| 133 | - return | ||
| 134 | - } | ||
| 135 | - | ||
| 136 | - if httpcode != 200 { | ||
| 137 | - err = errors.New("httpcode!= 200") | ||
| 138 | - lxalilog.Errors("httpcode error:", err, apiurl) | ||
| 139 | - return | ||
| 140 | - } | ||
| 141 | - | ||
| 142 | - err = json.Unmarshal(content, &member) | ||
| 143 | - if err != nil { | ||
| 144 | - lxalilog.Errors("json.Unmarshal error:", err, apiurl, string(content)) | ||
| 145 | - return | ||
| 146 | - } | ||
| 147 | - | ||
| 148 | - if member.Code != "0" { | ||
| 149 | - err = errors.New("ret.Code != 0") | ||
| 150 | - lxalilog.Errors(err, apiurl, string(content)) | ||
| 151 | - return | ||
| 152 | - } | ||
| 153 | - | ||
| 154 | - return | ||
| 155 | -} |
sign/index.go
| @@ -1,309 +0,0 @@ | @@ -1,309 +0,0 @@ | ||
| 1 | -package sign | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/api-common/config" | ||
| 5 | - "apigame/sdk" | ||
| 6 | - "apigame/service/constd" | ||
| 7 | - "apigame/util/util-lx/lxalilog" | ||
| 8 | - "apigame/util/util-lx/lxarray" | ||
| 9 | - "apigame/util/util-lx/lxconv" | ||
| 10 | - "apigame/util/util-lx/lxlimit" | ||
| 11 | - "apigame/util/util-lx/lxtime" | ||
| 12 | - "encoding/json" | ||
| 13 | - "errors" | ||
| 14 | - "fmt" | ||
| 15 | - | ||
| 16 | - "sort" | ||
| 17 | - "strings" | ||
| 18 | - "unicode/utf8" | ||
| 19 | - | ||
| 20 | - "github.com/astaxie/beego/validation" | ||
| 21 | -) | ||
| 22 | - | ||
| 23 | -type MCheckConfig struct { | ||
| 24 | - CheckUrlGameID bool | ||
| 25 | - CheckToken bool | ||
| 26 | - CheckSign bool | ||
| 27 | - FunName string | ||
| 28 | - Bodys []byte | ||
| 29 | - Ip lxlimit.MFuncItem `json:"ip"` | ||
| 30 | - Kernel lxlimit.MFuncItem `json:"kernel"` | ||
| 31 | - Member lxlimit.MFuncItem `json:"member"` | ||
| 32 | - Url string `json:"url"` | ||
| 33 | - Params map[string]string `json:"params"` | ||
| 34 | -} | ||
| 35 | - | ||
| 36 | -func getTimeStamp(time_stamp interface{}) (timestamp int64) { | ||
| 37 | - if time_stamp == nil { | ||
| 38 | - return | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - tsp := "" | ||
| 42 | - | ||
| 43 | - switch tp := time_stamp.(type) { | ||
| 44 | - case string: | ||
| 45 | - tsp = fmt.Sprintf("%s", tp) | ||
| 46 | - } | ||
| 47 | - | ||
| 48 | - if tsp == "" { | ||
| 49 | - return | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - timestamp = lxconv.ParseInt64(tsp) | ||
| 53 | - lth := utf8.RuneCountInString(tsp) | ||
| 54 | - if lth > 10 { | ||
| 55 | - timestamp = timestamp / 1000 | ||
| 56 | - } | ||
| 57 | - | ||
| 58 | - return | ||
| 59 | - | ||
| 60 | -} | ||
| 61 | - | ||
| 62 | -func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig config.MApiGameConfig, err error) { | ||
| 63 | - | ||
| 64 | - var ( | ||
| 65 | - postGameId string | ||
| 66 | - urlGameId string | ||
| 67 | - ty string | ||
| 68 | - c lxlimit.MFuncConfig | ||
| 69 | - nowtime = lxtime.NowUninx() | ||
| 70 | - time_stamp int64 | ||
| 71 | - JG = int64(2) | ||
| 72 | - ) | ||
| 73 | - | ||
| 74 | - // 检查时间戳 | ||
| 75 | - tempData := make(map[string]interface{}) | ||
| 76 | - _ = json.Unmarshal(cgg.Bodys, &tempData) | ||
| 77 | - | ||
| 78 | - time_stamp = getTimeStamp(tempData["time_stamp"]) | ||
| 79 | - if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) { | ||
| 80 | - code = constd.RECODE_REQUESTTIME_ERROR | ||
| 81 | - err = errors.New(code) | ||
| 82 | - lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys)) | ||
| 83 | - return | ||
| 84 | - } | ||
| 85 | - | ||
| 86 | - c.Ip = cgg.Ip | ||
| 87 | - c.Kernel = cgg.Kernel | ||
| 88 | - c.Params = cgg.Params | ||
| 89 | - c.Url = cgg.Url | ||
| 90 | - c.BodyBy = cgg.Bodys | ||
| 91 | - if cgg.FunName == "" { | ||
| 92 | - c.FunName = c.Url | ||
| 93 | - } | ||
| 94 | - c.Member = cgg.Member | ||
| 95 | - | ||
| 96 | - for k, v := range c.Params { | ||
| 97 | - if k == ":gameid" { | ||
| 98 | - urlGameId = v | ||
| 99 | - } | ||
| 100 | - } | ||
| 101 | - | ||
| 102 | - if cgg.CheckUrlGameID && urlGameId == "" { | ||
| 103 | - code = constd.RECODE_PARAMERROR | ||
| 104 | - err = errors.New(code) | ||
| 105 | - lxalilog.Errors("urlGameid error:") | ||
| 106 | - return | ||
| 107 | - } | ||
| 108 | - | ||
| 109 | - postGameId, ty = lxlimit.CheckLimit(c) | ||
| 110 | - | ||
| 111 | - if cgg.CheckUrlGameID && postGameId != urlGameId { | ||
| 112 | - code = constd.RECODE_PARAMERROR | ||
| 113 | - err = errors.New(code) | ||
| 114 | - lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata) | ||
| 115 | - return | ||
| 116 | - } | ||
| 117 | - | ||
| 118 | - if ty != "" { | ||
| 119 | - code = constd.RECODE_REQUESTXIANLIU_ERROR | ||
| 120 | - err = errors.New(ty) | ||
| 121 | - return | ||
| 122 | - } | ||
| 123 | - | ||
| 124 | - err = json.Unmarshal(cgg.Bodys, &postdata) | ||
| 125 | - if err != nil { | ||
| 126 | - code = constd.RECODE_PARAMERROR | ||
| 127 | - lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys)) | ||
| 128 | - return | ||
| 129 | - } | ||
| 130 | - | ||
| 131 | - valid := validation.Validation{} | ||
| 132 | - | ||
| 133 | - var b bool | ||
| 134 | - | ||
| 135 | - b, err = valid.Valid(postdata) | ||
| 136 | - if err != nil { | ||
| 137 | - code = constd.RECODE_PARAMERROR | ||
| 138 | - lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) | ||
| 139 | - return | ||
| 140 | - } | ||
| 141 | - | ||
| 142 | - if !b { | ||
| 143 | - code = constd.RECODE_PARAMERROR | ||
| 144 | - err = errors.New(code) | ||
| 145 | - lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) | ||
| 146 | - return | ||
| 147 | - } | ||
| 148 | - | ||
| 149 | - if cgg.CheckSign { | ||
| 150 | - code, gameconfig, err = CheckSign(postdata, cgg.CheckToken) | ||
| 151 | - if err != nil { | ||
| 152 | - return | ||
| 153 | - } | ||
| 154 | - } | ||
| 155 | - | ||
| 156 | - return | ||
| 157 | -} | ||
| 158 | - | ||
| 159 | -// Check 检查签名 | ||
| 160 | -func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (code string, err error) { | ||
| 161 | - | ||
| 162 | - err = json.Unmarshal(req, &postdata) | ||
| 163 | - if err != nil { | ||
| 164 | - code = constd.RECODE_PARAMERROR | ||
| 165 | - lxalilog.Errors("json.Unmarshal error:", err, string(req)) | ||
| 166 | - return | ||
| 167 | - } | ||
| 168 | - | ||
| 169 | - valid := validation.Validation{} | ||
| 170 | - | ||
| 171 | - var b bool | ||
| 172 | - | ||
| 173 | - b, err = valid.Valid(postdata) | ||
| 174 | - if err != nil { | ||
| 175 | - code = constd.RECODE_PARAMERROR | ||
| 176 | - lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) | ||
| 177 | - return | ||
| 178 | - } | ||
| 179 | - | ||
| 180 | - if !b { | ||
| 181 | - code = constd.RECODE_PARAMERROR | ||
| 182 | - err = errors.New(code) | ||
| 183 | - lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) | ||
| 184 | - return | ||
| 185 | - } | ||
| 186 | - | ||
| 187 | - if checkSign { | ||
| 188 | - code, _, err = CheckSign(postdata, checkToken) | ||
| 189 | - if err != nil { | ||
| 190 | - return | ||
| 191 | - } | ||
| 192 | - } | ||
| 193 | - | ||
| 194 | - return | ||
| 195 | -} | ||
| 196 | - | ||
| 197 | -// CheckSign 校验签名 | ||
| 198 | -func CheckSign(data interface{}, checkToken bool) (code string, gameconfig config.MApiGameConfig, err error) { | ||
| 199 | - | ||
| 200 | - var ( | ||
| 201 | - logstr string | ||
| 202 | - ) | ||
| 203 | - | ||
| 204 | - jsonBody, _ := json.Marshal(data) | ||
| 205 | - | ||
| 206 | - logstr += string(jsonBody) | ||
| 207 | - | ||
| 208 | - var newdata = make(map[string]interface{}) | ||
| 209 | - | ||
| 210 | - err = json.Unmarshal(jsonBody, &newdata) | ||
| 211 | - if err != nil { | ||
| 212 | - code = constd.RECODE_SIGNERROR | ||
| 213 | - lxalilog.Errors("json.Unmarshal error:", err) | ||
| 214 | - return | ||
| 215 | - } | ||
| 216 | - | ||
| 217 | - if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" { | ||
| 218 | - code = constd.RECODE_SIGNERROR | ||
| 219 | - err = errors.New("签名错误,参数错误" + logstr) | ||
| 220 | - lxalilog.Errors(err) | ||
| 221 | - return | ||
| 222 | - } | ||
| 223 | - | ||
| 224 | - gameid := newdata["gameid"].(string) | ||
| 225 | - | ||
| 226 | - gameconfig, err = config.GetApiGameConfig(gameid) | ||
| 227 | - if err != nil { | ||
| 228 | - lxalilog.Errors(err) | ||
| 229 | - return | ||
| 230 | - } | ||
| 231 | - | ||
| 232 | - if newdata["sign"].(string) == "fb0ba80fad895664c7aea7c8ce462505" { | ||
| 233 | - return | ||
| 234 | - } | ||
| 235 | - | ||
| 236 | - appkey := gameconfig.Appkey | ||
| 237 | - | ||
| 238 | - if appkey == "" { | ||
| 239 | - code = constd.RECODE_SIGNERROR | ||
| 240 | - err = errors.New("签名错误,参数错误" + gameid + "no appkey") | ||
| 241 | - lxalilog.Errors(err) | ||
| 242 | - return | ||
| 243 | - } | ||
| 244 | - | ||
| 245 | - sign := newdata["sign"] | ||
| 246 | - | ||
| 247 | - sortdata := make([]string, 0, len(newdata)) | ||
| 248 | - | ||
| 249 | - fiterword := "and|exec|insert|select|delete|update|count|master|truncate|declare|char(|mid(|chr(|'" | ||
| 250 | - fiterwords := strings.Split(fiterword, "|") | ||
| 251 | - var fiterkey []interface{} | ||
| 252 | - | ||
| 253 | - for k, v := range newdata { | ||
| 254 | - newv := lxconv.InterfaceToStr(v) | ||
| 255 | - | ||
| 256 | - if b := lxarray.InArray(newv, fiterwords); b { | ||
| 257 | - fiterkey = append(fiterkey, k) | ||
| 258 | - } | ||
| 259 | - if newv != "" && newv != "0" && k != "sign" && k != "ver" && k != "dev" && k != "dever" && k != "pkv" { | ||
| 260 | - sortdata = append(sortdata, k) | ||
| 261 | - } | ||
| 262 | - } | ||
| 263 | - | ||
| 264 | - if len(fiterkey) > 0 { | ||
| 265 | - code = constd.RECODE_WEIXINAZIFU_ERROR | ||
| 266 | - err = errors.New("fiterkey error" + logstr) | ||
| 267 | - lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata)) | ||
| 268 | - return | ||
| 269 | - } | ||
| 270 | - | ||
| 271 | - sort.Strings(sortdata) | ||
| 272 | - valstr := "" | ||
| 273 | - for _, k := range sortdata { // 先下标,再数值 | ||
| 274 | - v := lxconv.InterfaceToStr(newdata[k]) | ||
| 275 | - valstr += k + "=" + v | ||
| 276 | - } | ||
| 277 | - | ||
| 278 | - valstr += appkey | ||
| 279 | - | ||
| 280 | - logstr += ",valstr:(" + valstr + ")" | ||
| 281 | - | ||
| 282 | - md5key := strings.ToLower(lxconv.EncryMD5(valstr)) | ||
| 283 | - | ||
| 284 | - if md5key != sign { | ||
| 285 | - code = constd.RECODE_SIGNERROR | ||
| 286 | - err = errors.New(code) | ||
| 287 | - lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata)) | ||
| 288 | - return | ||
| 289 | - } | ||
| 290 | - | ||
| 291 | - if checkToken { | ||
| 292 | - | ||
| 293 | - if newdata["uid"] == nil || newdata["token"] == nil { | ||
| 294 | - code = constd.RECODE_PARAMERROR | ||
| 295 | - err = errors.New(code) | ||
| 296 | - lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata)) | ||
| 297 | - return | ||
| 298 | - } | ||
| 299 | - | ||
| 300 | - err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"])) | ||
| 301 | - if err != nil { | ||
| 302 | - code = constd.RECODE_LOGINCHECK_ERROR | ||
| 303 | - return | ||
| 304 | - } | ||
| 305 | - | ||
| 306 | - } | ||
| 307 | - | ||
| 308 | - return | ||
| 309 | -} |