auth.go 2.5 KB

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