transfer_yl/cmd/api/internal/middleware/signMiddleware.go

77 lines
1.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package middleware
import (
"bytes"
"encoding/json"
"io"
"net/http"
"rs/cmd/api/internal/config"
"rs/cmd/api/internal/types"
"rs/untils/response"
"rs/untils/sign"
)
type SignMiddleware struct {
c *config.Config
}
func NewSignMiddleware(c *config.Config) *SignMiddleware {
return &SignMiddleware{
c: c,
}
}
var signMiddleware = map[string]interface{}{
"/market/order/get": new(types.GetOrderReq),
"/market/key/asyncSend": new(types.AsyncReq),
}
func (m *SignMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var (
reqDataMap map[string]interface{}
)
originalBody, err := io.ReadAll(r.Body)
reqData := make([]byte, len(originalBody))
copy(reqData, originalBody)
r.Body = io.NopCloser(bytes.NewReader(originalBody))
if err != nil {
response.Err(w, response.HTTP_AUTH_FAIL, "获取请求参数失败")
}
// 特殊处理, 订单查询接口,只获取需要字段校验
if v, ok := signMiddleware[r.RequestURI]; ok {
err = json.Unmarshal(reqData, v)
if err != nil {
response.Err(w, response.HTTP_AUTH_FAIL, "获取请求参数失败")
return
}
reqData, err = json.Marshal(v)
}
err = json.Unmarshal(reqData, &reqDataMap)
if err != nil {
response.Err(w, response.HTTP_AUTH_FAIL, "获取请求参数失败")
}
if _, ok := reqDataMap["sign"]; !ok {
response.Err(w, response.HTTP_AUTH_FAIL, "未找到签名字段")
}
if _, ok := reqDataMap["sign"]; !ok {
response.Err(w, response.HTTP_AUTH_FAIL, err.Error())
}
// 订单查询过滤supplierOrderNo 不参与签名
if r.RequestURI == "/market/order/get" {
delete(reqDataMap, "supplierOrderNo")
}
signString := reqDataMap["sign"].(string)
sysSign, err := sign.GetSign(reqDataMap, m.c.Sys.Key)
if sysSign != signString {
response.Err(w, response.HTTP_AUTH_FAIL, "签名不正确")
return
}
next(w, r)
}
}