123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- package routers
- import (
- "ColdVerify_server/conf"
- "ColdVerify_server/controllers"
- "ColdVerify_server/lib"
- "ColdVerify_server/logs"
- "crypto/hmac"
- "crypto/sha256"
- "encoding/hex"
- "errors"
- beego "github.com/beego/beego/v2/server/web"
- "github.com/beego/beego/v2/server/web/context"
- "strconv"
- "time"
- )
- const apiKeyHeader = "X-API-KEY"
- const apiSignatureHeader = "X-API-SIGNATURE"
- const apiTimestampHeader = "X-API-TIMESTAMP"
- func isValidSignature(apiKey, signature, timestamp string) bool {
- // 使用提供的 API Key 查找对应的 API Secret
- if apiKey != conf.OpenApi_Key {
- return false
- }
- secret := conf.OpenApi_Secret
- // 计算签名,签名内容是 "apiKey + timestamp"
- message := apiKey + timestamp
- mac := hmac.New(sha256.New, []byte(secret))
- mac.Write([]byte(message))
- expectedSignature := hex.EncodeToString(mac.Sum(nil))
- logs.Println("apiKey:", apiKey)
- logs.Println("secret:", secret)
- logs.Println("时间戳:", timestamp)
- logs.Println("生成的签名:", expectedSignature)
- logs.Println("传递的签名:", signature)
- // 验证客户端提供的签名是否与预期签名匹配
- return hmac.Equal([]byte(signature), []byte(expectedSignature))
- }
- func ApiKeyAuthMiddleware(ctx *context.Context) {
- apiKey := ctx.Input.Query(apiKeyHeader)
- signature := ctx.Input.Query(apiSignatureHeader)
- timestamp := ctx.Input.Query(apiTimestampHeader)
- // 检查 API Key, 签名和时间戳是否存在
- if apiKey == "" || signature == "" || timestamp == "" {
- err := errors.New("API Key, Signature, and Timestamp required")
- data := lib.JSONS{Code: 202, Msg: err.Error()}
- ctx.Output.JSON(data, true, false)
- return
- }
- // 校验请求的签名是否有效
- if !isValidSignature(apiKey, signature, timestamp) {
- err := errors.New("Invalid Signature")
- data := lib.JSONS{Code: 202, Msg: err.Error()}
- ctx.Output.JSON(data, true, false)
- return
- }
- // 校验时间戳是否在合理范围内(防止重放攻击)
- sec, _ := strconv.ParseInt(timestamp, 10, 64)
- reqTime := time.Unix(sec, 0)
- if time.Since(reqTime) > 5*time.Minute {
- err := errors.New("Request too old or invalid timestamp")
- data := lib.JSONS{Code: 202, Msg: err.Error()}
- ctx.Output.JSON(data, true, false)
- return
- }
- }
- func init() {
- //beego.InsertFilter("/openapi", beego.BeforeRouter, ApiKeyAuthMiddleware)
- ns := beego.NewNamespace("/openapi",
- beego.NSBefore(ApiKeyAuthMiddleware),
- beego.NSRouter("/admin/list", &controllers.AccountController{}, "*:Account_List_All_For_ERP"), // 管理员所有列表
- beego.NSRouter("/company/list", &controllers.UserController{}, "*:User_List_All_For_ERP"), // 公司所有列表
- beego.NSRouter("/task/list", &controllers.TaskController{}, "*:Task_List_All_For_ERP"), // 公司所有列表
- )
- beego.AddNamespace(ns)
- }
|