jwt.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. if len(s.Key) == 0 {
  23. fmt.Println("jwt key is nil")
  24. return ""
  25. }
  26. t := jwt.NewWithClaims(jwt.SigningMethodHS256,
  27. UserClaims{
  28. UserId: userId,
  29. RegisteredClaims: jwt.RegisteredClaims{
  30. ExpiresAt: jwt.NewNumericDate(time.Now().Add(s.TokenExpireDuration)),
  31. },
  32. })
  33. token, err := t.SignedString(s.Key)
  34. if err != nil {
  35. fmt.Printf("jwt token generate error: %v", err)
  36. return ""
  37. }
  38. return token
  39. }
  40. func (s *Jwt) ParseToken(tokenString string) (uint, error) {
  41. token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  42. return s.Key, nil
  43. })
  44. if err != nil {
  45. return 0, err
  46. }
  47. if claims, ok := token.Claims.(*UserClaims); ok && token.Valid {
  48. return claims.UserId, nil
  49. }
  50. return 0, err
  51. }