← MockServer Professional Module 7 • Capstone Project (Final)

Module 7: Enterprise Custom Gateway & Capstone Project (MockServer Enterprise Security & Management Portal)

คู่มือพิมพ์เขียวเชิงลึกและการวิเคราะห์ทางเทคนิค: การสร้าง Custom Auth Proxy Gateway ชั้นกลาง, การจัดการสิทธิ์ RBAC (Editor vs Read-Only), ระบบ Data Masking ป้องกัน PII และ Bearer Token รั่วไหล, Audit Logging, Silent Disaster Recovery Backup และ Hybrid Conditional Forwarding

[1] ส่วนที่ 1: หมุดเชื่อมโยง & Roadmap Progress Tracker

Module 7: Complete Curriculum

ชื่อบท/หัวข้อหลัก: Module 7: Enterprise Custom Gateway & Capstone Project (MockServer Enterprise Security & Management Portal)

❓ หมุดตั้งโจทย์: "ทำไมบทนี้ถึงชื่อนี้? และเรากำลังเรียนเรื่องนี้ไปเพื่ออะไร?"

ตอบ: ใน Module 1–6 เราได้เรียนรู้เอนจินหลักของ MockServer ทั้งในด้าน Architecture, Expectation Matchers, Proxying, Chaos Engineering, AI-Native MCP และ Native Security มาอย่างโชกโชน ใน Module 7 (Capstone Module) นี้ เราจะนำความรู้ทั้งหมดมาถักทอเข้ากับ Custom Auth Proxy Gateway Layer เพื่อสร้าง Enterprise Management Portal ที่ตอบโจทย์การใช้งานจริงในองค์กร ตอบสนอง Requirement ด้านความปลอดภัย, การคุมสิทธิ์ RBAC, Data Masking, Audit Logging และ Disaster Recovery อย่างสมบูรณ์แบบ

PROGRESS ROADMAP (COMPLETE):
✓ Mod 1
✓ Mod 2
✓ Mod 3
✓ Mod 4
✓ Mod 5
✓ Mod 6
🚀 Mod 7: Capstone

[2] ส่วนที่ 2: เรื่องราวและมโนทัศน์เชิงลึก (Narrative, Case Study & Dual-Layer Architecture)

1. ฉากสถานการณ์จริง (The Narrative/Case Study)

วิกฤตการใช้งาน Native MockServer ร่วมกันในองค์กรระดับ 100+ คน

องค์กรระดับการเงินแห่งหนึ่งประสบปัญหาเมื่อเปิดให้ทีมพัฒนาและ QA กว่า 100 คนใช้งาน Native MockServer ร่วมกันบนสถาปัตยกรรมเดิม:

  • การชนกันของข้อมูล (Data Collision): QA คนหนึ่งกดปุ่ม Clear All บน UI ทำให้ Mocks และ Test Suites ของเพื่อนร่วมทีมหายเกลี้ยงทั้งระบบ
  • ความเสี่ยงด้านความปลอดภัย (Security Risk): ไม่มีระบบล็อกอินและไม่มี Audit Log บันทึกว่าใครเป็นคนเข้ามาแก้ไขหรือลบ Mocks
  • ข้อมูลรั่วไหล (PII & Token Leakage): Authorization Header และข้อมูลบัตรเครดิตจริงที่ใช้ทดสอบหลุดเข้าไปบันทึกอยู่ใน System Logs ของเซิร์ฟเวอร์

💡 สถาปัตยกรรม Dual-Layer Architecture: แก้ปัญหาด้วยการสร้าง Custom Auth Proxy Gateway คั่นกลางระหว่างผู้ใช้กับ MockServer Engine

2. สถาปัตยกรรม Dual-Layer Architecture (Mental Model)
  [ Client / QA User ]
           │
           ▼ (Port 3000)
┌────────────────────────────────────────────────────────────────────────┐
│                      AUTH PROXY GATEWAY (EXPRESS.JS)                   │
│  - Authentication & RBAC (Editor vs Read-Only Guard)                 │
│  - Pre-Validation (Validate JSON Schema & Path Structure)             │
│  - Data Masking Engine (Sanitize PII & Bearer Tokens)                  │
│  - Audit Trail Engine (Record Who, When, Env, Payload Diff)           │
│  - Silent Event-Driven Snapshot (Backend Disaster Recovery)            │
└────────────────────────────────────────────────────────────────────────┘
           │
           ▼ (Port 1080)
┌────────────────────────────────────────────────────────────────────────┐
│                        MOCKSERVER IN-MEMORY ENGINE                     │
│  - Active Expectations Matching & Priority Evaluation                  │
│  - Response Delivery (200, 4xx, 5xx, Latency, Drop Connection)         │
│  - Conditional Hybrid Forwarding (JSON Schema Body Matching)          │
└────────────────────────────────────────────────────────────────────────┘
⚠️ Root Cause (รากของปัญหา)

การเปิดให้ใช้งาน Native MockServer โดยตรงไม่มี Access Control, ไม่มี Data Sanitization และขาดระบบ Backup อัตโนมัติหลังบ้าน

📉 Business Impact (ผลกระทบทางธุรกิจ)

ความเสียหายจากการที่ Mocks ถูกลบทำลาย, ความเสี่ยงด้านการผิดกฎหมาย PDPA จากการรั่วไหลของข้อมูล PII และขาดความโปร่งใสในการตรวจสอบ (Audit Trail)

[3] ส่วนที่ 3: การถอดรหัสและอธิบายโค้ดอย่างละเอียด (Line-by-line Breakdown)

1. Express Auth Proxy Gateway (proxy/server.js)
const express = require('express');
const axios = require('axios');
const fs = require('fs');
const app = express();
app.use(express.json());

const MOCKSERVER_URL = process.env.MOCKSERVER_URL || 'http://localhost:1080';

// 1. RBAC Guard Middleware
function checkRBAC(req, res, next) {
    const userRole = req.headers['x-user-role'] || 'READ_ONLY';
    const isWriteMethod = ['POST', 'PUT', 'DELETE'].includes(req.method);

    if (isWriteMethod && userRole === 'READ_ONLY') {
        return res.status(403).json({
            error: 'Forbidden',
            message: 'คุณอยู่ในสิทธิ์ Read-Only ไม่สามารถเพิ่มหรือแก้ไข Mocks ได้'
        });
    }
    next();
}

// 2. Data Masking Function
function maskSensitiveData(data) {
    let jsonStr = JSON.stringify(data);
    // Mask Bearer Tokens
    jsonStr = jsonStr.replace(/Bearer\s+[A-Za-z0-9\-\._~\+\/]+=*/g, 'Bearer ***MASKED***');
    // Mask Credit Card Numbers (16 digits)
    jsonStr = jsonStr.replace(/\b(?:\d[ -]*?){13,16}\b/g, '****-****-****-****');
    return JSON.parse(jsonStr);
}

// 3. Proxy Handler with Audit Trail & Silent Backup
app.put('/mockserver/expectation', checkRBAC, async (req, res) => {
    try {
        const maskedBody = maskSensitiveData(req.body);

        // Forward request to MockServer Engine
        const response = await axios.put(`${MOCKSERVER_URL}/mockserver/expectation`, req.body);

        // Record Audit Log
        const auditLog = {
            timestamp: new Date().toISOString(),
            user: req.headers['x-user-name'] || 'Unknown',
            env: req.headers['x-env'] || 'QA',
            action: 'CREATE_OR_UPDATE_EXPECTATION',
            payload: maskedBody
        };
        fs.appendFileSync('./logs/audit.log', JSON.stringify(auditLog) + '\n');

        // Silent Event-Driven Snapshot (Backend Backup)
        triggerSilentBackup();

        res.status(response.status).send(response.data);
    } catch (err) {
        res.status(err.response?.status || 500).json({ error: err.message });
    }
});

async function triggerSilentBackup() {
    try {
        const activeExpectations = await axios.put(`${MOCKSERVER_URL}/mockserver/retrieve?type=EXPECTATIONS`);
        fs.writeFileSync('./backups/expectations_latest.json', JSON.stringify(activeExpectations.data, null, 2));
    } catch (e) {
        console.error('Silent Backup Failed:', e.message);
    }
}

app.listen(3000, () => console.log('Auth Proxy Gateway running on port 3000'));
2. Hybrid Conditional Forwarding (expectations/seed_scenarios.json)
[
  {
    "httpRequest": {
      "method": "POST",
      "path": "/api/v1/orders",
      "body": {
        "type": "JSON_SCHEMA",
        "jsonSchema": {
          "type": "object",
          "required": ["orderId"],
          "properties": {
            "orderId": {
              "type": "string",
              "pattern": "^MOCK-.*"
            }
          }
        }
      }
    },
    "httpResponse": {
      "statusCode": 200,
      "headers": { "Content-Type": ["application/json"] },
      "body": {
        "status": "SUCCESS",
        "source": "MOCK_SERVER_ENGINE",
        "message": "Mock response for order matching MOCK-* pattern"
      }
    },
    "priority": 100
  },
  {
    "httpRequest": {
      "method": "POST",
      "path": "/api/v1/orders"
    },
    "httpForward": {
      "host": "httpbin.org",
      "port": 80,
      "scheme": "HTTP"
    },
    "priority": 10
  }
]
3. UI Code Generator with Auto-Inject Session Header (dashboard-wrapper.html)
function generateCurlCommand(expectation) {
    const activeToken = localStorage.getItem('authToken') || 'eyJhbGciOiJKV1QiLC...';
    const activeSessionId = localStorage.getItem('sessionId') || 'sess_qa_somchai';

    let curl = `curl -i -X ${expectation.httpRequest.method || 'GET'} "http://localhost:3000${expectation.httpRequest.path}" \\\n`;

    // Auto-Inject Active Session Headers
    curl += `  -H "Authorization: Bearer ${activeToken}" \\\n`;
    curl += `  -H "X-Session-ID: ${activeSessionId}" \\\n`;
    curl += `  -H "Content-Type: application/json"`;

    if (expectation.httpRequest.body) {
        const bodyStr = JSON.stringify(expectation.httpRequest.body);
        curl += ` \\\n  -d '${bodyStr}'`;
    }

    return curl;
}

[4] ส่วนที่ 4: คู่มือการใช้งานผ่าน Web UI & API Gateway Portal

เปิดเว็บเบราว์เซอร์เข้าสู่ Portal (Port 3000): http://localhost:3000

========================================================================================
                       ENTERPRISE MANAGEMENT PORTAL (PORT 3000)
========================================================================================
 Authentication / RBAC:    - ล็อกอินด้วยบัญชี Somsri (สิทธิ์ Read-Only) หรือ Somchai (สิทธิ์ Editor)
                           - บัญชี Read-Only จะมองเห็น Mocks แต่ปุ่ม Save/Delete จะถูกระงับ (HTTP 403)

 📋 Copy cURL Generator:   - แต่ละการ์ด Expectation บน Dashboard มีปุ่ม "Copy cURL"
                           - ระบบทำการ Auto-Inject Authorization Header และ Session Token ให้ทันที

 Audit Trail Monitor:      - ทุกคำสั่งสร้าง/แก้ไข Mocks จะถูกบันทึกลง ./logs/audit.log พร้อม Data Masking

[5] ส่วนที่ 5: โครงสร้างไฟล์โปรเจกต์มาตรฐาน (Enterprise Capstone Structure)

mockserver-enterprise-capstone/
├── docker-compose.yml
├── proxy/
│   ├── server.js                         # Express Auth Proxy Gateway (RBAC, Masking, Audit)
│   └── package.json
├── config/
│   └── mockserver.properties
├── expectations/
│   └── seed_scenarios.json               # Hybrid Conditional Forwarding (Priority & Schema)
├── backups/                              # Silent Event-Driven Snapshot Storage
│   └── expectations_latest.json
├── logs/
│   └── audit.log                         # Sanitized Audit Trail Records
└── tests/
    └── CapstoneIntegrationTest.js

[6] ส่วนที่ 6: แบบฝึกหัดภาคปฏิบัติแน่นๆ (Hands-on Refactoring & 6 Drills)

❌ Flawed Approach (เปิด Native UI ตรงๆ ไม่มี Auth Proxy)

ลบหรือเปลี่ยน Mocks ได้ทุกคน ไม่มี Audit Trail และข้อมูล PII รั่วไหลลง Log:

app.post('/api/v1/orders/mock', handleMock);
app.post('/api/v1/orders/real', forwardToReal);
✅ Refactored Approach (ครอบ Auth Proxy Gateway บน Port 3000)

ตรวจสอบ RBAC ทำ Data Masking ป้องกัน PII และรวม Endpoint เดียวผ่าน Hybrid Forwarding:

app.post('/api/v1/orders', checkRBAC, (req, res) => {
    // Single Endpoint - Controlled via Request Body Matcher logic inside MockServer Engine
});
ชุดแบบฝึกหัดปฏิบัติการ 6 ข้อ (Hands-on Drill Pack)

ก่อนเริ่มทำ ตรวจสอบว่าเปิด Auth Proxy Gateway ไว้ที่ http://localhost:3000 เรียบร้อยแล้ว

Drill 7.1: ทดสอบ RBAC Guard (Read-Only Blocking)

Action:

curl -i -X PUT "http://localhost:3000/mockserver/expectation" -H "x-user-role: READ_ONLY" -H "Content-Type: application/json" -d '{"httpRequest": {"path": "/test-rbac"}, "httpResponse": {"statusCode": 200}}'

Expected: HTTP/1.1 403 Forbidden พร้อมข้อความแจ้งเตือนสิทธิ์ Read-Only

Drill 7.2: ทดสอบ Multi-Scenario & Priority Matching

Action:

curl -i -X POST "http://localhost:3000/api/v1/payments" -H "X-User-Type: VIP" -H "Content-Type: application/json" -d '{"amount": 500}'

Expected: VIP ได้รับ 200 OK จาก Mock Engine ตาม Priority สูงสุด

Drill 7.3: ทดสอบ Conditional Forwarding via Body Regex (POST /api/v1/orders)

Action (Case A - Mock Mode):

curl -i -X POST "http://localhost:3000/api/v1/orders" -H "Content-Type: application/json" -d '{"orderId": "MOCK-101", "item": "Laptop"}'

Expected: ได้รับ Mock JSON (source: MOCK_SERVER_ENGINE)

Drill 7.4: ทดสอบ Chaos Latency Simulation (Delay 3s)

Action:

curl -i -X POST "http://localhost:3000/api/v1/payments/delay"

Expected: หน่วงเวลา 3 วินาทีก่อนตอบกลับ 200 OK

Drill 7.5: ทดสอบ Connection Drop Simulation

Action:

curl -i -X POST "http://localhost:3000/api/v1/payments/timeout"

Expected: curl: (52) Empty reply from server (Socket ถูกตัดสายทันที)

Drill 7.6: ตรวจสอบ Audit Log & Data Masking

Action:

tail -n 1 ./logs/audit.log

Expected: JSON Audit Log ที่แสดงชื่อผู้ทำ, เวลา, Env และ Authorization: Bearer ***MASKED***

⚡ Instant Feedback Quiz

ส่วนที่ 7: แบบทดสอบประเมินความรู้ Module 7 Capstone (10 ข้อ)

คลิกเลือกคำตอบข้อที่ถูกต้อง ระบบจะตรวจให้คะแนนและแสดงผลเฉลยพร้อมคำอธิบายทันที!

คะแนนสด 0 / 10
[8]

ส่วนที่ 8: สรุปหมุดเชื่อมโยงกลับหาหัวข้อบท (Closing Title Connection Wrap-up)

เนื้อหาและแบบฝึกหัดทั้งหมดในวันนี้ ตอบและสะท้อนชื่อบท Module 7: Enterprise Custom Gateway & Capstone Project อย่างสมบูรณ์: การผสาน MockServer Engine เข้ากับ Custom Auth Proxy Gateway ช่วยให้เราครอบครองสถาปัตยกรรมระดับ Enterprise-Grade API Management & Mocking Platform ที่มีความยืดหยุ่น ปลอดภัย ควบคุมสิทธิ์ RBAC, ทำ Data Masking ป้องกัน PII และตรวจสอบได้ 100% พร้อมใช้งานในระดับ Production จริงครับ! 🌟 ยินดีด้วยครับที่คุณสำเร็จหลักสูตร Roadmap to MockServer Professional อย่างสมบูรณ์แบบ!