auth.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package middleware
  2. import (
  3. "fmt"
  4. "sfbase/global"
  5. "sfbase/redis"
  6. sutils "sfbase/utils"
  7. "sfis/db"
  8. "sfis/model"
  9. "sfis/model/response"
  10. "sfis/utils"
  11. "strconv"
  12. "strings"
  13. "time"
  14. "github.com/gin-gonic/gin"
  15. "go.uber.org/zap"
  16. )
  17. const TimestampExpireTime = 600 //单位秒,header里的时间戳超时时间 10分钟
  18. func TokenAuth() gin.HandlerFunc {
  19. return func(context *gin.Context) {
  20. var (
  21. requestUrl string
  22. token string
  23. timestamp string
  24. appID string
  25. productID int
  26. requestIP string
  27. )
  28. requestUrl = context.Request.URL.String()
  29. global.Logger.Info(requestUrl)
  30. requestUrl = strings.Split(requestUrl, "v1")[1]
  31. global.Logger.Info(requestUrl)
  32. // a := strings.Split(requestUrl, "/")
  33. // requestUrl = a[4]
  34. if p, ok := utils.ApiUrlCache.Load(requestUrl); ok {
  35. productID = p.(int)
  36. } else {
  37. response.FailWithDetailed(response.ParamError, nil, "url错误", context)
  38. context.Abort()
  39. return
  40. }
  41. // productID = 1000
  42. token = context.Request.Header.Get("token")
  43. timestamp = context.Request.Header.Get("timestamp")
  44. appID = context.PostForm("app_id")
  45. if appID == "" || token == "" || timestamp == "" {
  46. response.FailWithDetailed(response.ParamEmpty, nil, "参数缺失或为空", context)
  47. context.Abort()
  48. return
  49. }
  50. _timestamp, err := strconv.ParseInt(timestamp, 10, 64)
  51. if err != nil {
  52. response.FailWithDetailed(response.ParamError, nil, "参数异常", context)
  53. context.Abort()
  54. return
  55. }
  56. now := time.Now().Unix()
  57. TimestampExpire := now - _timestamp
  58. if TimestampExpire < 0 {
  59. TimestampExpire = -TimestampExpire
  60. }
  61. if TimestampExpire > TimestampExpireTime {
  62. //token时间验证 十分钟
  63. response.FailWithDetailed(response.TokenExpired, nil, "签名过期", context)
  64. context.Abort()
  65. return
  66. }
  67. user := utils.GetUserByAppID(appID)
  68. secretKey := user.SecretKey
  69. ipWhiteList := user.IpWhiteList
  70. userName := user.Name
  71. global.Logger.Info("用户:", zap.Any("userName:", userName), zap.Any("appID:", appID), zap.Any("secretKey:", secretKey), zap.Any("ipWhiteList:", ipWhiteList))
  72. /**
  73. 第一步:ip白名单校验
  74. */
  75. requestIP = utils.GetIp(context.Request)
  76. if ipWhiteList != "*" {
  77. if strings.Index(ipWhiteList, requestIP) < 0 {
  78. response.FailWithDetailed(response.IpInvalid, nil, "ip不在白名单", context)
  79. context.Abort()
  80. return
  81. }
  82. }
  83. /**
  84. 第二步:MD5签名校验
  85. */
  86. signToken := sutils.MD5(fmt.Sprintf("%s%s%s", appID, timestamp, user.SecretKey))
  87. if token != signToken {
  88. response.FailWithDetailed(response.TokenInvalid, nil, "身份验证失败", context)
  89. context.Abort()
  90. return
  91. }
  92. userProduct := &model.UserProduct{}
  93. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
  94. //校验是否过期
  95. end := userProduct.EndAt
  96. if now > end.Unix() {
  97. response.FailWithDetailed(response.InterfaceExpired, nil, "剩余量已过期", context)
  98. context.Abort()
  99. return
  100. }
  101. //校验每日调用上限
  102. limittodaykey := fmt.Sprintf("limittoday_%d_%d_%s", time.Now().Day(), productID, appID)
  103. limittoday := redis.GetInt("limit", limittodaykey)
  104. if limittoday >= userProduct.CallTimesLimitDay { //当天调用超过次数
  105. response.FailWithDetailed(response.MoreThanEveryDayDataNumberLimit, nil, "请求超过每日调用总量限制", context)
  106. context.Abort()
  107. return
  108. } else {
  109. if limittoday == 0 {
  110. _, max := sutils.GetDayMinMax(time.Now())
  111. redis.Put("limit", limittodaykey, 0, int(max-now))
  112. }
  113. }
  114. context.Set("appID", appID)
  115. context.Set("productID", productID)
  116. context.Set("requestIP", requestIP)
  117. }
  118. }