93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
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)))
|
|
}
|