添加文件: xy_sh/internal/middleware/middleware.go

This commit is contained in:
renzhiyuan 2026-07-27 10:11:31 +08:00
parent 929f3aa897
commit 05dce1d5cb
1 changed files with 120 additions and 0 deletions

View File

@ -0,0 +1,120 @@
package middleware
import (
"encoding/json"
"xy_sh/internal/entities"
"xy_sh/pkg/crypto"
"github.com/gofiber/fiber/v2"
)
func SignVerifyMiddleware() fiber.Handler {
return func(c *fiber.Ctx) error {
timestamp := c.Get("timestamp")
sign := c.Get("sign")
if timestamp == "" || sign == "" {
return c.Status(fiber.StatusUnauthorized).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "缺少timestamp或sign请求头",
Data: nil,
})
}
body := c.Body()
var req entities.EncryptedRequest
if err := json.Unmarshal(body, &req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "请求体格式错误",
Data: nil,
})
}
if req.EncryptedData == "" {
return c.Status(fiber.StatusBadRequest).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "缺少encryptedData参数",
Data: nil,
})
}
if !crypto.VerifySign(timestamp, req.EncryptedData, sign) {
return c.Status(fiber.StatusUnauthorized).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "签名验证失败",
Data: nil,
})
}
decryptedData, err := crypto.SM4CBCDecrypt(req.EncryptedData)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "数据解密失败: " + err.Error(),
Data: nil,
})
}
c.Locals("decryptedData", decryptedData)
c.Locals("timestamp", timestamp)
return c.Next()
}
}
func EncryptResponseMiddleware() fiber.Handler {
return func(c *fiber.Ctx) error {
err := c.Next()
if err != nil {
return err
}
body := c.Response().Body()
if len(body) == 0 {
return nil
}
var resp entities.CommonResponse
if err := json.Unmarshal(body, &resp); err != nil {
return nil
}
if resp.Data != nil {
dataBytes, err := json.Marshal(resp.Data)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "响应数据序列化失败",
Data: nil,
})
}
encryptedData, err := crypto.SM4CBCEncrypt(dataBytes)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "响应数据加密失败",
Data: nil,
})
}
resp.Data = encryptedData
newBody, err := json.Marshal(resp)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(entities.CommonResponse{
Code: entities.CodeFailed,
Msg: "响应序列化失败",
Data: nil,
})
}
c.Response().SetBody(newBody)
}
return nil
}
}