jwt.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package common
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "time"
  6. jwtgo "github.com/dgrijalva/jwt-go"
  7. )
  8. // secret:加密秘钥
  9. // expire:过期时间,单位为秒
  10. type JWT struct {
  11. secret []byte
  12. expire int64
  13. }
  14. type CustomClaims struct {
  15. AccountId string `json:"id"`
  16. Claims json.RawMessage `json:"claims,omitempty"`
  17. jwtgo.StandardClaims
  18. }
  19. var (
  20. DefaultJWT *JWT
  21. ErrTokenExpired = errors.New("token expired")
  22. ErrTokenInvalid = errors.New("token invalid")
  23. )
  24. const (
  25. jwtHeader = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
  26. )
  27. func InitJWT(secret string, expire int64) {
  28. DefaultJWT = NewJWT(secret, expire)
  29. }
  30. func NewJWT(secret string, expire int64) *JWT {
  31. var j = new(JWT)
  32. j.secret = []byte(secret)
  33. j.expire = expire
  34. return j
  35. }
  36. func (j *JWT) NewToken(accountID string, claimMap json.RawMessage) (token string, tokenExpire int64, err error) {
  37. expireAt := time.Now().Add(time.Duration(j.expire) * time.Second).Unix()
  38. claims := CustomClaims{
  39. AccountId: accountID,
  40. Claims: claimMap,
  41. StandardClaims: jwtgo.StandardClaims{
  42. ExpiresAt: expireAt,
  43. //Id: utils.GetUUIDNoDash(),
  44. },
  45. }
  46. t := jwtgo.NewWithClaims(jwtgo.SigningMethodHS256, claims)
  47. token, err = t.SignedString(j.secret)
  48. if err != nil {
  49. return
  50. }
  51. token = token[37:]
  52. tokenExpire = claims.ExpiresAt
  53. return
  54. }
  55. func (j *JWT) Parse(jwtString string) (userId string, expiresAt int64, claimMap json.RawMessage, err error) {
  56. jwtString = jwtHeader + "." + jwtString
  57. token, err := jwtgo.ParseWithClaims(jwtString, &CustomClaims{}, func(token *jwtgo.Token) (interface{}, error) {
  58. return j.secret, nil
  59. })
  60. if err != nil {
  61. if ve, ok := err.(*jwtgo.ValidationError); ok {
  62. if ve.Errors == jwtgo.ValidationErrorExpired {
  63. err = ErrTokenExpired
  64. }
  65. }
  66. return
  67. }
  68. if claims, ok := token.Claims.(*CustomClaims); ok {
  69. userId = claims.AccountId
  70. expiresAt = claims.StandardClaims.ExpiresAt
  71. claimMap = claims.Claims
  72. if token.Valid {
  73. return
  74. }
  75. }
  76. err = ErrTokenInvalid
  77. return
  78. }
  79. //func (j *JWT) RevokeToken(sess string) error {
  80. // return j.adapter.Revoke(sess)
  81. //}
  82. //type JWTSessionAdapter interface {
  83. // //Validate(sessID, accountID string) bool
  84. // //Store(sessID, accountID, refreshToken string) error
  85. // //Revoke(sessID string) error
  86. // //GenerateSess() (string, error)
  87. //}
  88. //
  89. //var ErrSessionInvalid = errors.New("session invalid")
  90. //
  91. //type DefaultJWTSessionAdatper struct {
  92. //}
  93. //
  94. //func NewDefaultAdapter() *DefaultJWTSessionAdatper {
  95. // return &DefaultJWTSessionAdatper{}
  96. //}
  97. //
  98. //func (a *DefaultJWTSessionAdatper) Store(sess, accountID, refreshToken string) error {
  99. // return nil
  100. //}
  101. //
  102. //func (a *DefaultJWTSessionAdatper) Validate(sess, accountID string) bool {
  103. // return true
  104. //
  105. //}
  106. //
  107. //func (a *DefaultJWTSessionAdatper) Revoke(sess string) error {
  108. // return nil
  109. //}
  110. //
  111. //func (a *DefaultJWTSessionAdatper) GenerateSess() (string, error) {
  112. // return utils.GetUUID(), nil
  113. //}