package auth import ( "errors" "time" "github.com/golang-jwt/jwt/v5" ) const SessionTTL = 7 * 24 * time.Hour type Claims struct { jwt.RegisteredClaims UserID int64 `json:"uid"` TokenVersion int `json:"ver"` } func IssueToken(secret []byte, userID int64, tokenVersion int, now time.Time) (string, error) { c := Claims{ RegisteredClaims: jwt.RegisteredClaims{ IssuedAt: jwt.NewNumericDate(now), ExpiresAt: jwt.NewNumericDate(now.Add(SessionTTL)), }, UserID: userID, TokenVersion: tokenVersion, } return jwt.NewWithClaims(jwt.SigningMethodHS256, c).SignedString(secret) } func ParseToken(secret []byte, tok string) (*Claims, error) { var c Claims _, err := jwt.ParseWithClaims(tok, &c, func(t *jwt.Token) (any, error) { return secret, nil }, jwt.WithValidMethods([]string{"HS256"}), jwt.WithExpirationRequired()) if err != nil { return nil, err } if c.UserID == 0 { return nil, errors.New("missing uid") } return &c, nil }