jwt.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package jwt
  2. import (
  3. "dy-admin/pkg/comopts"
  4. "github.com/gin-gonic/gin"
  5. "github.com/golang-jwt/jwt/v4"
  6. "github.com/pkg/errors"
  7. "time"
  8. )
  9. var (
  10. TokenExpired = errors.New("Token is expired")
  11. TokenNotValidYet = errors.New("Token not active yet")
  12. TokenMalformed = errors.New("That's not even a token")
  13. TokenInvalid = errors.New("Couldn't handle this token:")
  14. )
  15. type CustomClaims struct {
  16. BaseClaims
  17. jwt.RegisteredClaims
  18. }
  19. type BaseClaims struct {
  20. UUID string
  21. UserID int
  22. Username string
  23. NickName string
  24. RoleIDs []int
  25. DeptID int
  26. RoleNames []string
  27. }
  28. type JWT struct {
  29. options *comopts.JwtOptions
  30. }
  31. func NewJWT(opt *comopts.JwtOptions) *JWT {
  32. return &JWT{
  33. options: opt,
  34. }
  35. }
  36. func (j *JWT) CreateClaims(baseClaims BaseClaims) CustomClaims {
  37. claims := CustomClaims{
  38. BaseClaims: baseClaims,
  39. RegisteredClaims: jwt.RegisteredClaims{
  40. NotBefore: jwt.NewNumericDate(time.Now()), // 签名生效时间
  41. ExpiresAt: jwt.NewNumericDate(time.Now().Add(j.options.Timeout)), // 过期时间 7天 配置文件
  42. Issuer: j.options.Realm, // 签名的发行者
  43. },
  44. }
  45. return claims
  46. }
  47. func (j *JWT) CreateToken(claims CustomClaims) (string, error) {
  48. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  49. return token.SignedString([]byte(j.options.Key))
  50. }
  51. //func (j *JWT) CreateTokenByOldToken(oldToken string, claims CustomClaims) (string, error) {
  52. // v, err, _ := global.ConcurrencyControl.Do("JWT:"+oldToken, func() (interface{}, error) {
  53. // return j.CreateToken(claims)
  54. // })
  55. // return v.(string), err
  56. //}
  57. func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) {
  58. token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
  59. return []byte(j.options.Key), nil
  60. })
  61. if err != nil {
  62. if ve, ok := err.(*jwt.ValidationError); ok {
  63. if ve.Errors&jwt.ValidationErrorMalformed != 0 {
  64. return nil, TokenMalformed
  65. } else if ve.Errors&jwt.ValidationErrorExpired != 0 {
  66. // Token is expired
  67. return nil, TokenExpired
  68. } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
  69. return nil, TokenNotValidYet
  70. } else {
  71. return nil, TokenInvalid
  72. }
  73. }
  74. }
  75. if token != nil {
  76. if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
  77. return claims, nil
  78. }
  79. return nil, TokenInvalid
  80. } else {
  81. return nil, TokenInvalid
  82. }
  83. }
  84. func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) {
  85. token := c.Request.Header.Get("Authorization")
  86. claims, err := j.ParseToken(token)
  87. if err != nil {
  88. return nil, err
  89. }
  90. return claims, err
  91. }
  92. func (j *JWT) GetUserID(c *gin.Context) int {
  93. if claims, exists := c.Get("claims"); !exists {
  94. if cl, err := j.GetClaims(c); err != nil {
  95. return 0
  96. } else {
  97. return cl.UserID
  98. }
  99. } else {
  100. waitUse := claims.(*CustomClaims)
  101. return waitUse.UserID
  102. }
  103. }
  104. func (j *JWT) GetDeptID(c *gin.Context) int {
  105. if claims, exists := c.Get("claims"); !exists {
  106. if cl, err := j.GetClaims(c); err != nil {
  107. return 0
  108. } else {
  109. return cl.DeptID
  110. }
  111. } else {
  112. waitUse := claims.(*CustomClaims)
  113. return waitUse.DeptID
  114. }
  115. }
  116. func (j *JWT) GetUserRoleIDs(c *gin.Context) []int {
  117. if claims, exists := c.Get("claims"); !exists {
  118. if cl, err := j.GetClaims(c); err != nil {
  119. return []int{}
  120. } else {
  121. return cl.RoleIDs
  122. }
  123. } else {
  124. waitUse := claims.(*CustomClaims)
  125. return waitUse.RoleIDs
  126. }
  127. }
  128. func (j *JWT) GetUserInfo(c *gin.Context) *CustomClaims {
  129. if claims, exists := c.Get("claims"); !exists {
  130. if cl, err := j.GetClaims(c); err != nil {
  131. return nil
  132. } else {
  133. return cl
  134. }
  135. } else {
  136. waitUse := claims.(*CustomClaims)
  137. return waitUse
  138. }
  139. }