token.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package token
  2. import (
  3. "errors"
  4. "github.com/dgrijalva/jwt-go"
  5. "github.com/gin-gonic/gin"
  6. "github.com/sirupsen/logrus"
  7. "os"
  8. "time"
  9. )
  10. type UserClaims struct {
  11. ID int64 `json:"user_id"`
  12. UserName string `json:"user_name"`
  13. RoleId int64 `json:"role_id"`
  14. Avatar string `json:"avatar"`
  15. Nickname string `json:"nickname"`
  16. jwt.StandardClaims
  17. }
  18. var (
  19. secret = []byte(os.Getenv("JWT_SECRET"))
  20. effectTime = 30 * 24 * time.Hour // 30天有效期
  21. )
  22. func GenerateToken(claims *UserClaims) (token string, err error) {
  23. claims.ExpiresAt = time.Now().Add(effectTime).Unix()
  24. sign, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(secret)
  25. if err != nil {
  26. return "", err
  27. }
  28. return sign, nil
  29. }
  30. func ParseToken(tokenString string) (claims *UserClaims, err error) {
  31. token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  32. return secret, nil
  33. })
  34. if err != nil {
  35. return nil, err
  36. }
  37. claims, ok := token.Claims.(*UserClaims)
  38. if !ok {
  39. return nil, errors.New("token is valid")
  40. }
  41. return claims, nil
  42. }
  43. func Refresh(tokenString string) (t string, err error) {
  44. jwt.TimeFunc = func() time.Time {
  45. return time.Unix(0, 0)
  46. }
  47. token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  48. return secret, nil
  49. })
  50. if err != nil {
  51. return "", err
  52. }
  53. claims, ok := token.Claims.(*UserClaims)
  54. if !ok {
  55. return "", errors.New("token is valid")
  56. }
  57. jwt.TimeFunc = time.Now
  58. claims.StandardClaims.ExpiresAt = time.Now().Add(effectTime).Unix()
  59. return GenerateToken(claims)
  60. }
  61. func Layout(tokenString string) (err error) {
  62. jwt.TimeFunc = func() time.Time {
  63. return time.Unix(0, 0)
  64. }
  65. _, err = jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  66. return secret, nil
  67. })
  68. if err != nil {
  69. return err
  70. }
  71. return
  72. }
  73. func GetAuthorization(c *gin.Context) (t string) {
  74. t = c.GetHeader("authorization")
  75. if t == "" {
  76. t = c.Request.URL.Query().Get("authorization")
  77. }
  78. return t
  79. }
  80. func CurrentUser(c *gin.Context) *UserClaims {
  81. if user, _ := c.Get("user"); user != nil {
  82. if u, ok := user.(*UserClaims); ok {
  83. return u
  84. }
  85. }
  86. logrus.Warn("CurrentUser = nil")
  87. return nil
  88. }
  89. func GetUID(c *gin.Context) int64 {
  90. user := CurrentUser(c)
  91. if user == nil {
  92. return 0
  93. }
  94. return user.ID
  95. }
  96. func GetUserName(c *gin.Context) string {
  97. user := CurrentUser(c)
  98. if user == nil {
  99. return `游客`
  100. }
  101. return user.UserName
  102. }