diff --git a/server/wheelserver/middleware/jwtauth.go b/server/wheelserver/middleware/jwtauth.go new file mode 100644 index 00000000..e352030a --- /dev/null +++ b/server/wheelserver/middleware/jwtauth.go @@ -0,0 +1,109 @@ +package middleware + +import ( + "f5" + "fmt" + "jccommon" + "main/mt" + "q5" + "strings" + + "github.com/gin-gonic/gin" +) + +func MaybeJwtAuth(c *gin.Context) { + internalJwtAuth(c, true) +} + +func JwtAuth(c *gin.Context) { + internalJwtAuth(c, false) +} + +/* + 'Authorization Bearer {JwtToken}' +*/ +func internalJwtAuth(c *gin.Context, maybe bool) { + tokenHeader := c.Request.Header.Get("Authorization") + jwtToken := "" + if len(tokenHeader) > 8 { + jwtToken = tokenHeader[7:] + } else { + if maybe { + c.Set("open_id", "") + c.Set("account_address", "") + c.Set("email", "") + c.Next() + return + } + } + internalMetaMaskJwtAuth(c, jwtToken) +} + +func internalMetaMaskJwtAuth(c *gin.Context, jwtToken string) { + params := map[string]string{ + "c": "MetaMaskJwt", + "a": "verify", + } + jsonReqObj := &struct { + Data string `json:"data"` + }{ + Data: jwtToken, + } + jsonRspObj := &struct { + ErrCode interface{} `json:"errcode"` + ErrMsg string `json:"errmsg"` + Decoded struct { + Id string `json:"id"` + OpenId string `json:"openid"` + Plat int32 `json:"plat"` + Version int32 `json:"version"` + Email string `json:"email"` + } `json:"decoded"` + }{} + rspObj := &struct { + ErrCode interface{} `json:"errcode"` + ErrMsg string `json:"errmsg"` + }{} + paramsStr := q5.EncodeJson(jsonReqObj) + url := fmt.Sprintf("%s/webapp/index.php", mt.Table.Web3ServiceCluster.RandElement().GetUrl()) + f5.GetHttpCliMgr().SendGoStyleJsonRspPost( + url, + params, + jsonRspObj, + q5.HTTP_HEADER_JSON, + paramsStr, + func(rsp f5.HttpCliResponse) { + if rsp.GetErr() != nil || + !rsp.JsonParseOk() { + rspObj.ErrCode = 500 + rspObj.ErrMsg = "server internal error" + c.JSON(200, rspObj) + c.Abort() + return + } + rspObj.ErrCode = q5.SafeToInt32(jsonRspObj.ErrCode) + rspObj.ErrMsg = jsonRspObj.ErrMsg + if q5.SafeToInt32(rspObj.ErrCode) != 0 { + rspObj.ErrCode = 501 + rspObj.ErrMsg = "jwt error" + c.JSON(200, rspObj) + c.Abort() + return + } + if jsonRspObj.Decoded.Plat != jccommon.BC_POLY_POLY_METAKASK { + rspObj.ErrCode = 501 + rspObj.ErrMsg = "not support this platform" + c.JSON(200, rspObj) + c.Abort() + f5.GetSysLog().Info("not support this platform:%s", rsp.GetRawData()) + return + } + openId := fmt.Sprintf("%d_2006_%s", + jccommon.BC_CHANNEL, + strings.ToLower(jsonRspObj.Decoded.OpenId)) + c.Set("open_id", openId) + c.Set("account_address", strings.ToLower(jsonRspObj.Decoded.OpenId)) + c.Set("email", strings.ToLower(jsonRspObj.Decoded.Email)) + c.Next() + }) +} diff --git a/server/wheelserver/mt/Web3ServiceCluster.go b/server/wheelserver/mt/Web3ServiceCluster.go new file mode 100644 index 00000000..a8569350 --- /dev/null +++ b/server/wheelserver/mt/Web3ServiceCluster.go @@ -0,0 +1,19 @@ +package mt + +import ( + "f5" + "main/mtb" +) + +type Web3ServiceCluster struct { + mtb.Web3ServiceCluster +} + +type Web3ServiceClusterTable struct { + f5.IdMetaTable[Web3ServiceCluster] + selfConf *Web3ServiceCluster +} + +func (this *Web3ServiceCluster) Init1() { + +} diff --git a/server/wheelserver/mt/export.go b/server/wheelserver/mt/export.go index bd9ff737..2a615059 100644 --- a/server/wheelserver/mt/export.go +++ b/server/wheelserver/mt/export.go @@ -8,6 +8,7 @@ type table struct { WheelServerCluster *WheelServerClusterTable //WheelDb *WheelDbTable Config *ConfigTable + Web3ServiceCluster *Web3ServiceClusterTable //Contract *ContractTable } @@ -17,6 +18,11 @@ var Table = f5.New(func(this *table) { this.PrimKey = "instance_id" }) + this.Web3ServiceCluster = f5.New(func(this *Web3ServiceClusterTable) { + this.FileName = "../config/web3service.cluster.json" + this.PrimKey = "instance_id" + }) + /* this.WheelDb = f5.New(func(this *WheelDbTable) { this.FileName = "../config/nftdb.mysql.json" diff --git a/server/wheelserver/mtb/mtb.auto_gen.go b/server/wheelserver/mtb/mtb.auto_gen.go index 55a0cba1..5d297a78 100644 --- a/server/wheelserver/mtb/mtb.auto_gen.go +++ b/server/wheelserver/mtb/mtb.auto_gen.go @@ -24,6 +24,13 @@ type WheelDb struct { _flags2_ uint64 } +type Web3ServiceCluster struct { + url string + + _flags1_ uint64 + _flags2_ uint64 +} + type Config struct { _flags1_ uint64 @@ -94,6 +101,14 @@ func (this *WheelDb) HasDatabase() bool { return (this._flags1_ & (uint64(1) << 5)) > 0 } +func (this *Web3ServiceCluster) GetUrl() string { + return this.url +} + +func (this *Web3ServiceCluster) HasUrl() bool { + return (this._flags1_ & (uint64(1) << 1)) > 0 +} + func (this *WheelServerCluster) LoadFromKv(kv map[string]interface{}) { f5.ReadMetaTableField(&this.instance_id, "instance_id", &this._flags1_, 1, kv) @@ -109,5 +124,9 @@ func (this *WheelDb) LoadFromKv(kv map[string]interface{}) { f5.ReadMetaTableField(&this.database, "database", &this._flags1_, 5, kv) } +func (this *Web3ServiceCluster) LoadFromKv(kv map[string]interface{}) { + f5.ReadMetaTableField(&this.url, "url", &this._flags1_, 1, kv) +} + func (this *Config) LoadFromKv(kv map[string]interface{}) { } diff --git a/server/wheelserver/proto/mt.proto b/server/wheelserver/proto/mt.proto index 0499705c..0e27854a 100644 --- a/server/wheelserver/proto/mt.proto +++ b/server/wheelserver/proto/mt.proto @@ -18,6 +18,11 @@ message WheelDb optional string database = 5; } +message Web3ServiceCluster +{ + optional string url = 1; +} + message Config { }