middleware.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package middleware
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/url"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "bet24.com/log"
  11. "bet24.com/public"
  12. "bet24.com/servers/payment/config"
  13. "github.com/gin-gonic/gin"
  14. "github.com/pkg/errors"
  15. "github.com/unrolled/secure"
  16. )
  17. // 身份验证(MD5)
  18. func CheckValid() gin.HandlerFunc {
  19. return func(c *gin.Context) {
  20. //验证签名
  21. //if _, err := verifySign(c); err != nil {
  22. //
  23. // _ = c.Request.ParseForm()
  24. // log.Error("IPAddress[%v] checkValid sign is error %v",
  25. // c.Request.RemoteAddr, err)
  26. //
  27. // c.Abort()
  28. // return
  29. //}
  30. _ = c.Request.ParseForm()
  31. req := c.Request.Form
  32. path := c.Request.URL.Path
  33. rawPath := c.Request.URL.RawPath
  34. log.Debug("%s ==> %s", path, req)
  35. start := time.Now()
  36. c.Next()
  37. //记录耗时信息
  38. if latency := time.Now().Sub(start); latency > 10*time.Second {
  39. log.Release("%v %v 访问耗时 %v =====> %+v",
  40. path, rawPath, latency, req)
  41. }
  42. }
  43. }
  44. // 验证签名
  45. func verifySign(c *gin.Context) (bool, error) {
  46. _ = c.Request.ParseForm()
  47. req := c.Request.Form
  48. ts := strings.Join(c.Request.Form["TimeStamp"], "")
  49. sn := strings.Join(c.Request.Form["Sign"], "")
  50. url := c.Request.URL.RequestURI()
  51. //log.Release("verifySign req=%+v", req)
  52. if ts == "" || sn == "" {
  53. return false, errors.New(fmt.Sprintf("%v GetQuery Error TimeStamp=%s Sign=%s",
  54. url, ts, sn))
  55. }
  56. //验证过期时间(5分钟)
  57. timeStamp := time.Now().Unix()
  58. var exp int64 = 5 * 60 * 60
  59. tsInt, _ := strconv.ParseInt(ts, 10, 64)
  60. if timeStamp-tsInt >= exp {
  61. return false, errors.New(fmt.Sprintf("%v timeStamp Error timeStamp=%d tsInt=%d exp=%d",
  62. url, timeStamp, tsInt, exp))
  63. }
  64. // 加密串
  65. checkContent := createEncryptStr(req) + fmt.Sprintf("&key=%s", config.Server.WebKey)
  66. //log.Debug("createSign MD5加密前=%s", checkContent)
  67. sign := public.GetMd5String(checkContent)
  68. //log.Debug("verifySign MD5加密后=%s", sign)
  69. //验证签名
  70. if sn == "" || sn != sign {
  71. return false, errors.New(fmt.Sprintf("%v sign error ReqParams=%+v Pequest[Sign]=%s checkContent=%s sign=%s",
  72. url, req, sn, checkContent, sign))
  73. }
  74. return true, nil
  75. }
  76. // 创建加密串
  77. func createEncryptStr(params url.Values) string {
  78. var key []string
  79. var str = ""
  80. for k := range params {
  81. if k != "Sign" {
  82. key = append(key, k)
  83. }
  84. }
  85. sort.Strings(key)
  86. for i := 0; i < len(key); i++ {
  87. if i != 0 {
  88. str = str + "&"
  89. }
  90. //log.Debug("key[%v]=%v", i, str)
  91. str = str + fmt.Sprintf("%v=%v", key[i], params.Get(key[i]))
  92. }
  93. return str
  94. }
  95. // 跨域中间件
  96. // 要在路由组之前全局使用「跨域中间件」, 否则OPTIONS会返回404
  97. func Cors() gin.HandlerFunc {
  98. return func(c *gin.Context) {
  99. method := c.Request.Method
  100. origin := c.Request.Header.Get("Origin")
  101. if origin != "" {
  102. c.Header("Access-Control-Allow-Origin", origin)
  103. c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
  104. c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
  105. c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")
  106. c.Header("Access-Control-Allow-Credentials", "false")
  107. c.Set("content-type", "application/json")
  108. }
  109. if method == "OPTIONS" {
  110. c.AbortWithStatus(http.StatusNoContent)
  111. return
  112. }
  113. c.Next()
  114. }
  115. }
  116. func TlsHandler() gin.HandlerFunc {
  117. return func(c *gin.Context) {
  118. secureMiddleware := secure.New(secure.Options{
  119. SSLRedirect: true,
  120. SSLHost: ":443",
  121. })
  122. err := secureMiddleware.Process(c.Writer, c.Request)
  123. if err != nil {
  124. c.Abort()
  125. return
  126. }
  127. c.Next()
  128. }
  129. }