token.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package token
  2. import (
  3. "errors"
  4. "gadmin/config"
  5. "github.com/dgrijalva/jwt-go"
  6. "github.com/gin-gonic/gin"
  7. "github.com/google/uuid"
  8. "github.com/sirupsen/logrus"
  9. "os"
  10. "time"
  11. )
  12. type UserClaims struct {
  13. ID int64 `json:"user_id"`
  14. UserName string `json:"user_name"`
  15. RoleId int64 `json:"role_id"`
  16. Avatar string `json:"avatar"`
  17. Nickname string `json:"nickname"`
  18. SystemId int32 `json:"system_id"`
  19. AccessToken string `json:"access_token"`
  20. jwt.StandardClaims
  21. }
  22. var (
  23. secret = []byte(os.Getenv("JWT_SECRET"))
  24. effectTime = 30 * 24 * time.Hour // 30天有效期
  25. )
  26. func GenerateToken(claims *UserClaims) (token string, err error) {
  27. claims.ExpiresAt = time.Now().Add(effectTime).Unix()
  28. sign, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(secret)
  29. if err != nil {
  30. return "", err
  31. }
  32. return sign, nil
  33. }
  34. func ParseToken(tokenString string) (claims *UserClaims, err error) {
  35. token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  36. return secret, nil
  37. })
  38. if err != nil {
  39. return nil, err
  40. }
  41. claims, ok := token.Claims.(*UserClaims)
  42. if !ok {
  43. return nil, errors.New("token is valid")
  44. }
  45. return claims, nil
  46. }
  47. func Refresh(tokenString string) (t string, err error) {
  48. jwt.TimeFunc = func() time.Time {
  49. return time.Unix(0, 0)
  50. }
  51. token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  52. return secret, nil
  53. })
  54. if err != nil {
  55. return "", err
  56. }
  57. claims, ok := token.Claims.(*UserClaims)
  58. if !ok {
  59. return "", errors.New("token is valid")
  60. }
  61. jwt.TimeFunc = time.Now
  62. claims.StandardClaims.ExpiresAt = time.Now().Add(effectTime).Unix()
  63. return GenerateToken(claims)
  64. }
  65. func Layout(tokenString string) (err error) {
  66. jwt.TimeFunc = func() time.Time {
  67. return time.Unix(0, 0)
  68. }
  69. _, err = jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  70. return secret, nil
  71. })
  72. if err != nil {
  73. return err
  74. }
  75. return
  76. }
  77. func GetAuthorization(c *gin.Context) (t string) {
  78. t = c.GetHeader("authorization")
  79. if t == "" {
  80. t = c.Request.URL.Query().Get("authorization")
  81. }
  82. return t
  83. }
  84. func CurrentUser(c *gin.Context) *UserClaims {
  85. if user, _ := c.Get("user"); user != nil {
  86. if u, ok := user.(*UserClaims); ok {
  87. return u
  88. }
  89. }
  90. logrus.Warn("CurrentUser = nil")
  91. return nil
  92. }
  93. func GetUID(c *gin.Context) int64 {
  94. user := CurrentUser(c)
  95. if user == nil {
  96. return 0
  97. }
  98. return user.ID
  99. }
  100. func GetUserName(c *gin.Context) string {
  101. user := CurrentUser(c)
  102. if user == nil {
  103. return `游客`
  104. }
  105. return user.UserName
  106. }
  107. func GetSystemId(c *gin.Context) int32 {
  108. user := CurrentUser(c)
  109. if user == nil {
  110. return 0
  111. }
  112. return user.SystemId
  113. }
  114. func SetSystemId(c *gin.Context, systemId int32) (string, error) {
  115. t := GetAuthorization(c)
  116. user, err := ParseToken(t)
  117. if err != nil {
  118. return "", err
  119. }
  120. err = Layout(t)
  121. if err != nil {
  122. return "", err
  123. }
  124. user.SystemId = systemId
  125. jwt.TimeFunc = time.Now
  126. user.StandardClaims.ExpiresAt = time.Now().Add(effectTime).Unix()
  127. t, err = GenerateToken(user)
  128. if err != nil {
  129. return "", err
  130. }
  131. // 记录登录token
  132. key := config.GetUserTokenKey(user.ID)
  133. config.TokenRedis.HSet(key, t, time.Now().Unix())
  134. config.TokenRedis.Expire(key, config.TokenExpireTime)
  135. return t, nil
  136. }
  137. func GenerateTokenUsingUUID() string {
  138. return uuid.New().String()
  139. }