auth.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package middleware
  2. import (
  3. "fmt"
  4. "sfbase/global"
  5. sutils "sfbase/utils"
  6. "sfis/model/response"
  7. "sfis/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "github.com/gin-gonic/gin"
  12. "go.uber.org/zap"
  13. )
  14. const TimestampExpireTime = 600 //单位秒,header里的时间戳超时时间 10分钟
  15. func TokenAuth() gin.HandlerFunc {
  16. return func(context *gin.Context) {
  17. var (
  18. requestUrl string
  19. token string
  20. timestamp string
  21. appID string
  22. productID int
  23. requestIP string
  24. )
  25. requestUrl = context.Request.URL.String()
  26. global.Logger.Info(requestUrl)
  27. requestUrl = strings.Split(requestUrl, "v1")[1]
  28. global.Logger.Info(requestUrl)
  29. // a := strings.Split(requestUrl, "/")
  30. // requestUrl = a[4]
  31. if p, ok := utils.ApiUrlCache.Load(requestUrl); ok {
  32. productID = p.(int)
  33. } else {
  34. response.FailWithDetailed(response.ParamError, nil, "url错误", context)
  35. context.Abort()
  36. return
  37. }
  38. // productID = 1000
  39. token = context.Request.Header.Get("token")
  40. timestamp = context.Request.Header.Get("timestamp")
  41. appID = context.PostForm("app_id")
  42. if appID == "" || token == "" || timestamp == "" {
  43. response.FailWithDetailed(response.ParamEmpty, nil, "参数缺失或为空", context)
  44. context.Abort()
  45. return
  46. }
  47. _timestamp, err := strconv.ParseInt(timestamp, 10, 64)
  48. if err != nil {
  49. response.FailWithDetailed(response.ParamError, nil, "参数异常", context)
  50. context.Abort()
  51. return
  52. }
  53. now := time.Now().Unix()
  54. TimestampExpire := now - _timestamp
  55. if TimestampExpire < 0 {
  56. TimestampExpire = -TimestampExpire
  57. }
  58. if TimestampExpire > TimestampExpireTime {
  59. //token时间验证 十分钟
  60. response.FailWithDetailed(response.TokenExpired, nil, "签名过期", context)
  61. context.Abort()
  62. return
  63. }
  64. user := utils.GetUserByAppID(appID)
  65. secretKey := user.SecretKey
  66. ipWhiteList := user.IpWhiteList
  67. userName := user.Name
  68. global.Logger.Info("用户:", zap.Any("userName:", userName), zap.Any("appID:", appID), zap.Any("secretKey:", secretKey), zap.Any("ipWhiteList:", ipWhiteList))
  69. /**
  70. 第一步:ip白名单校验
  71. */
  72. requestIP = utils.GetIp(context.Request)
  73. if ipWhiteList != "*" {
  74. if strings.Index(ipWhiteList, requestIP) < 0 {
  75. response.FailWithDetailed(response.IpInvalid, nil, "ip不在白名单", context)
  76. context.Abort()
  77. return
  78. }
  79. }
  80. /**
  81. 第二步:MD5签名校验
  82. */
  83. signToken := sutils.MD5(fmt.Sprintf("%s%s%s", appID, timestamp, user.SecretKey))
  84. if token != signToken {
  85. response.FailWithDetailed(response.TokenInvalid, nil, "身份验证失败", context)
  86. context.Abort()
  87. return
  88. }
  89. context.Set("appID", appID)
  90. context.Set("productID", productID)
  91. context.Set("requestIP", requestIP)
  92. }
  93. }