package requestEncrypt import ( "bytes" _ "embed" "encoding/base64" "encoding/json" "fmt" "io" "net/url" "strings" "91porn-server/common/constant" "91porn-server/common/crypt" "91porn-server/common/log" "91porn-server/middleware/ua" "github.com/gin-gonic/gin" ) var ( // 白名单,不需要验证token的api // 在新的Auth中间件逻辑下,配置了白名单后,用户未登录,context中的uid会被设为0;否则,会绑定用户真实uid。 // 需要白名单中API的handler自己对用户登录状态进行判断。 whitelist = map[string]bool{ "/swagger": true, "/api/app/vid/m3u8": true, //前端测试 下载m3u8 添加到白名单 ,生产环境中需要从白名单中剔除 } ) //go:embed public.pem var PubKey []byte type Req struct { Data string `json:"data" form:"data"` Sign string `json:"sign" form:"sign"` } // ReqDecode 解密 func ReqDecode(ctx *gin.Context) { var err error val, exists := ctx.Get(constant.CtxUA) if !exists { return } for url, ok := range whitelist { if ok && (strings.HasPrefix(ctx.Request.URL.Path, url) || strings.HasPrefix(ctx.FullPath(), url)) { return } } u, ok := val.(ua.UA) if !ok { return } if u.Terminal != constant.TerminalH5 && u.Terminal != constant.TerminalWeb { //h5 和纯web都加密 return } var data Req if err = ctx.ShouldBind(&data); err != nil { return } if data.Data == "" { return } dataBaseBytes, _ := base64.StdEncoding.DecodeString(data.Data) dataBytes, err := crypt.AesDecrypt(string(dataBaseBytes), "BxJand%xf5h3sycH") if err != nil { log.Warn("ReqDecode is error", log.Any("data", data.Data), log.Any("ua", u)) } if ctx.Request.Method == "GET" { m := make(map[string]interface{}) dec := json.NewDecoder(strings.NewReader(dataBytes)) dec.UseNumber() // 保留数字原始表示,避免 float64 精度丢失/科学计数法 _ = dec.Decode(&m) values := url.Values{} for k, v := range m { // 解密后的 JSON 值可能是数字、布尔等非字符串类型,不能直接断言为 string,否则会 panic switch val := v.(type) { case string: values.Add(k, val) case nil: values.Add(k, "") default: values.Add(k, fmt.Sprintf("%v", val)) } } ctx.Request.URL.RawQuery = values.Encode() ctx.Request.Form = values return } ctx.Request.Body = io.NopCloser(bytes.NewBuffer([]byte(dataBytes))) }