mwt.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package common
  2. import (
  3. "time"
  4. "github.com/vmihailenco/msgpack/v5"
  5. "github.com/dcsunny/mwt"
  6. )
  7. //MWT secret:加密秘钥
  8. // expire:过期时间,单位为秒
  9. type MWT struct {
  10. secret []byte
  11. expire int64
  12. }
  13. type MWTClaims struct {
  14. AccountId string `msgpack:"id"`
  15. Claims msgpack.RawMessage `msgpack:"claims,omitempty"`
  16. mwt.StandardClaims
  17. }
  18. var (
  19. DefaultMWT *MWT
  20. )
  21. const (
  22. mwtHeader = "gqN0eXCjTVdUo2FsZ6VIUzI1Ng"
  23. )
  24. func InitMWT(secret string, expire int64) {
  25. DefaultMWT = NewMWT(secret, expire)
  26. }
  27. func NewMWT(secret string, expire int64) *MWT {
  28. var j = new(MWT)
  29. j.secret = []byte(secret)
  30. j.expire = expire
  31. return j
  32. }
  33. func (j *MWT) NewToken(accountID string, claimMap msgpack.RawMessage) (token string, tokenExpire int64, err error) {
  34. expireAt := time.Now().Add(time.Duration(j.expire) * time.Second).Unix()
  35. claims := MWTClaims{
  36. AccountId: accountID,
  37. Claims: claimMap,
  38. StandardClaims: mwt.StandardClaims{
  39. ExpiresAt: expireAt,
  40. },
  41. }
  42. t := mwt.NewWithClaims(mwt.SigningMethodHS256, claims)
  43. token, err = t.SignedString(j.secret)
  44. if err != nil {
  45. return
  46. }
  47. token = token[27:]
  48. tokenExpire = claims.ExpiresAt
  49. return
  50. }
  51. func (j *MWT) Parse(text string) (userId string, expiresAt int64, claimMap msgpack.RawMessage, err error) {
  52. text = mwtHeader + "." + text
  53. token, err := mwt.ParseWithClaims(text, &MWTClaims{}, func(token *mwt.Token) (interface{}, error) {
  54. return j.secret, nil
  55. })
  56. if err != nil {
  57. if ve, ok := err.(*mwt.ValidationError); ok {
  58. if ve.Errors == mwt.ValidationErrorExpired {
  59. err = ErrTokenExpired
  60. }
  61. }
  62. return
  63. }
  64. if claims, ok := token.Claims.(*MWTClaims); ok {
  65. userId = claims.AccountId
  66. expiresAt = claims.StandardClaims.ExpiresAt
  67. claimMap = claims.Claims
  68. if token.Valid {
  69. return claims.AccountId, claims.StandardClaims.ExpiresAt, claims.Claims, nil
  70. }
  71. }
  72. err = ErrTokenInvalid
  73. return
  74. }