jwt.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package jwt
  2. import (
  3. "fmt"
  4. "github.com/golang-jwt/jwt/v5"
  5. "time"
  6. )
  7. type Jwt struct {
  8. Key []byte
  9. TokenExpireDuration time.Duration
  10. }
  11. type UserClaims struct {
  12. UserId uint `json:"user_id"`
  13. jwt.RegisteredClaims
  14. }
  15. func NewJwt(key string, tokenExpireDuration time.Duration) *Jwt {
  16. return &Jwt{
  17. Key: []byte(key),
  18. TokenExpireDuration: tokenExpireDuration,
  19. }
  20. }
  21. func (s *Jwt) GenerateToken(userId uint) string {
  22. t := jwt.NewWithClaims(jwt.SigningMethodHS256,
  23. UserClaims{
  24. UserId: userId,
  25. RegisteredClaims: jwt.RegisteredClaims{
  26. ExpiresAt: jwt.NewNumericDate(time.Now().Add(s.TokenExpireDuration)),
  27. },
  28. })
  29. token, err := t.SignedString(s.Key)
  30. if err != nil {
  31. fmt.Println(err)
  32. return ""
  33. }
  34. return token
  35. }
  36. func (s *Jwt) ParseToken(tokenString string) (uint, error) {
  37. token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  38. return s.Key, nil
  39. })
  40. if err != nil {
  41. return 0, err
  42. }
  43. if claims, ok := token.Claims.(*UserClaims); ok && token.Valid {
  44. return claims.UserId, nil
  45. }
  46. return 0, err
  47. }