jwt.go 1.3 KB

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