token.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package middleware
  2. import (
  3. "encoding/base64"
  4. "gadmin/config"
  5. "gadmin/utility/serializer"
  6. "gadmin/utility/token"
  7. "github.com/gin-gonic/gin"
  8. jsoniter "github.com/json-iterator/go"
  9. "github.com/sirupsen/logrus"
  10. "os"
  11. "strconv"
  12. "time"
  13. )
  14. // 路由白名单
  15. var whitelist = []string{
  16. "/api/gm/userRoles",
  17. }
  18. // Token 验证token
  19. func Token() gin.HandlerFunc {
  20. return func(c *gin.Context) {
  21. if isWhite(c.Request.URL.Path) {
  22. c.Next()
  23. return
  24. }
  25. encodeToken := token.GetAuthorization(c)
  26. if encodeToken == "" {
  27. c.JSON(200, serializer.CheckLogin())
  28. c.Abort()
  29. return
  30. }
  31. bytesT, err := base64.URLEncoding.DecodeString(encodeToken)
  32. if err != nil {
  33. logrus.Warningf("middleware base64.URLEncoding.DecodeString:%+v", err.Error())
  34. c.JSON(200, serializer.CheckLogin())
  35. c.Abort()
  36. return
  37. }
  38. t := string(bytesT)
  39. tokenKey := config.GetTokenKey(t)
  40. if config.TokenRedis.Exists(tokenKey).Val() == 0 {
  41. c.JSON(200, serializer.CheckLogin())
  42. c.Abort()
  43. return
  44. }
  45. userStr := config.TokenRedis.Get(tokenKey).Val()
  46. user := new(token.UserClaims)
  47. if err := jsoniter.UnmarshalFromString(userStr, user); err != nil {
  48. c.JSON(200, serializer.CheckLogin())
  49. c.Abort()
  50. return
  51. }
  52. if user.ID == 0 {
  53. c.JSON(200, serializer.CheckLogin())
  54. c.Abort()
  55. return
  56. }
  57. // 查询登录token是否有效
  58. key := config.GetUserTokenKey(user.ID)
  59. tokenCTStr := config.TokenRedis.HGet(key, t).Val()
  60. tokenCreateTime, err := strconv.Atoi(tokenCTStr)
  61. if err != nil {
  62. logrus.Warningf("middleware config.LogRedis.HGet:%+v", err.Error())
  63. c.JSON(200, serializer.CheckLogin())
  64. c.Abort()
  65. return
  66. }
  67. if tokenCreateTime == 0 {
  68. c.JSON(200, serializer.CheckLogin())
  69. c.Abort()
  70. return
  71. }
  72. tokenCT := time.Now()
  73. // 正式环境校验token有效期
  74. if os.Getenv("GIN_MODE") == "release" {
  75. tokenCT = time.Unix(int64(tokenCreateTime), 0)
  76. }
  77. if tokenCT.Before(time.Now().Add(-config.TokenExpireTime)) {
  78. c.JSON(200, serializer.CheckLogin())
  79. c.Abort()
  80. return
  81. }
  82. config.TokenRedis.HSet(key, t, time.Now().Unix())
  83. config.TokenRedis.Expire(key, time.Hour*12)
  84. config.TokenRedis.Expire(tokenKey, time.Hour*12)
  85. //if os.Getenv("GIN_MODE") == "release" && claims.UserName == "mojun" {
  86. // c.JSON(200, serializer.CheckLogin())
  87. // c.Abort()
  88. // return
  89. //}
  90. c.Set("user", user)
  91. c.Set("admin_role_id", user.RoleId)
  92. c.Next()
  93. return
  94. }
  95. }
  96. func isWhite(path string) bool {
  97. for _, v := range whitelist {
  98. if path == v {
  99. return true
  100. }
  101. }
  102. return false
  103. }