jwt.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package jwt
  2. import (
  3. "errors"
  4. "strings"
  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 uint
  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 uint, 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. tokenString = strings.TrimPrefix(tokenString, "Bearer ")
  41. if strings.TrimSpace(tokenString) == "" {
  42. return nil, errors.New("token is empty")
  43. }
  44. token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
  45. return j.key, nil
  46. })
  47. if err != nil {
  48. return nil, err
  49. }
  50. if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
  51. return claims, nil
  52. } else {
  53. return nil, err
  54. }
  55. }