jwt.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package jwt
  2. import (
  3. "errors"
  4. "regexp"
  5. "time"
  6. "github.com/golang-jwt/jwt/v5"
  7. "github.com/spf13/viper"
  8. )
  9. type JWT struct {
  10. key []byte
  11. }
  12. type MyCustomClaims struct {
  13. UserId string
  14. jwt.RegisteredClaims
  15. }
  16. func NewJwt(conf *viper.Viper) *JWT {
  17. return &JWT{key: []byte(conf.GetString("security.jwt.key"))}
  18. }
  19. func (j *JWT) GenToken(userId string, expiresAt time.Time) (string, error) {
  20. token := jwt.NewWithClaims(jwt.SigningMethodHS256, MyCustomClaims{
  21. UserId: userId,
  22. RegisteredClaims: jwt.RegisteredClaims{
  23. ExpiresAt: jwt.NewNumericDate(expiresAt),
  24. IssuedAt: jwt.NewNumericDate(time.Now()),
  25. NotBefore: jwt.NewNumericDate(time.Now()),
  26. Issuer: "",
  27. Subject: "",
  28. ID: "",
  29. Audience: []string{},
  30. },
  31. })
  32. // Sign and get the complete encoded token as a string using the key
  33. tokenString, err := token.SignedString(j.key)
  34. if err != nil {
  35. return "", err
  36. }
  37. return tokenString, nil
  38. }
  39. func (j *JWT) ParseToken(tokenString string) (*MyCustomClaims, error) {
  40. re := regexp.MustCompile(`(?i)Bearer `)
  41. tokenString = re.ReplaceAllString(tokenString, "")
  42. if tokenString == "" {
  43. return nil, errors.New("token is empty")
  44. }
  45. token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
  46. return j.key, nil
  47. })
  48. if err != nil {
  49. return nil, err
  50. }
  51. if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
  52. return claims, nil
  53. } else {
  54. return nil, err
  55. }
  56. }