@@ -0,0 +1,92 @@
|
||||
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)))
|
||||
}
|
||||
Reference in New Issue
Block a user