package jwt import ( "errors" "time" "github.com/golang-jwt/jwt/v5" ) type Claims struct { UserID uint `json:"uid"` Username string `json:"username"` Role string `json:"role"` jwt.RegisteredClaims } type Manager struct { Secret []byte ExpireHrs int } func New(secret string, expireHrs int) *Manager { return &Manager{Secret: []byte(secret), ExpireHrs: expireHrs} } func (m *Manager) Generate(userID uint, username, role string) (string, error) { claims := Claims{ UserID: userID, Username: username, Role: role, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(m.ExpireHrs) * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), }, } t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return t.SignedString(m.Secret) } func (m *Manager) Parse(tokenStr string) (*Claims, error) { claims := &Claims{} t, err := jwt.ParseWithClaims(tokenStr, claims, func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("unexpected signing method") } return m.Secret, nil }) if err != nil { return nil, err } if !t.Valid { return nil, errors.New("invalid token") } return claims, nil }