package api import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" "strconv" "strings" "time" ) func issueToken(secret string, ttl time.Duration) string { exp := time.Now().Add(ttl).Unix() return fmt.Sprintf("%d.%s", exp, signToken(secret, exp)) } func verifyToken(secret, token string) bool { parts := strings.SplitN(token, ".", 2) if len(parts) != 2 { return false } exp, err := strconv.ParseInt(parts[0], 10, 64) if err != nil || time.Now().Unix() > exp { return false } expected := signToken(secret, exp) return hmac.Equal([]byte(parts[1]), []byte(expected)) } func signToken(secret string, exp int64) string { mac := hmac.New(sha256.New, []byte(secret)) _, _ = mac.Write([]byte(strconv.FormatInt(exp, 10))) return hex.EncodeToString(mac.Sum(nil)) }