คู่มือพิมพ์เขียวเชิงลึกและการวิเคราะห์ทางเทคนิค: การสร้าง Custom Auth Proxy Gateway ชั้นกลาง, การจัดการสิทธิ์ RBAC (Editor vs Read-Only), ระบบ Data Masking ป้องกัน PII และ Bearer Token รั่วไหล, Audit Logging, Silent Disaster Recovery Backup และ Hybrid Conditional Forwarding
ชื่อบท/หัวข้อหลัก: 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 อย่างสมบูรณ์แบบ
วิกฤตการใช้งาน Native MockServer ร่วมกันในองค์กรระดับ 100+ คน
องค์กรระดับการเงินแห่งหนึ่งประสบปัญหาเมื่อเปิดให้ทีมพัฒนาและ QA กว่า 100 คนใช้งาน Native MockServer ร่วมกันบนสถาปัตยกรรมเดิม:
💡 สถาปัตยกรรม Dual-Layer Architecture: แก้ปัญหาด้วยการสร้าง Custom Auth Proxy Gateway คั่นกลางระหว่างผู้ใช้กับ MockServer Engine
[ 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) │
└────────────────────────────────────────────────────────────────────────┘
การเปิดให้ใช้งาน Native MockServer โดยตรงไม่มี Access Control, ไม่มี Data Sanitization และขาดระบบ Backup อัตโนมัติหลังบ้าน
ความเสียหายจากการที่ Mocks ถูกลบทำลาย, ความเสี่ยงด้านการผิดกฎหมาย PDPA จากการรั่วไหลของข้อมูล PII และขาดความโปร่งใสในการตรวจสอบ (Audit Trail)
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'));
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
}
]
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;
}
เปิดเว็บเบราว์เซอร์เข้าสู่ 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
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
ลบหรือเปลี่ยน Mocks ได้ทุกคน ไม่มี Audit Trail และข้อมูล PII รั่วไหลลง Log:
app.post('/api/v1/orders/mock', handleMock);
app.post('/api/v1/orders/real', forwardToReal);
ตรวจสอบ 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
});
ก่อนเริ่มทำ ตรวจสอบว่าเปิด Auth Proxy Gateway ไว้ที่ http://localhost:3000 เรียบร้อยแล้ว
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
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 สูงสุด
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)
Action:
curl -i -X POST "http://localhost:3000/api/v1/payments/delay"
Expected: หน่วงเวลา 3 วินาทีก่อนตอบกลับ 200 OK
Action:
curl -i -X POST "http://localhost:3000/api/v1/payments/timeout"
Expected: curl: (52) Empty reply from server (Socket ถูกตัดสายทันที)
Action:
tail -n 1 ./logs/audit.log
Expected: JSON Audit Log ที่แสดงชื่อผู้ทำ, เวลา, Env และ Authorization: Bearer ***MASKED***
คลิกเลือกคำตอบข้อที่ถูกต้อง ระบบจะตรวจให้คะแนนและแสดงผลเฉลยพร้อมคำอธิบายทันที!
คะแนนของคุณคือ ...
เนื้อหาและแบบฝึกหัดทั้งหมดในวันนี้ ตอบและสะท้อนชื่อบท 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 อย่างสมบูรณ์แบบ!