Hệ thống cũ của bạn nối vào Ebig bằng cách nào
Một câu hỏi CTO luôn hỏi trước khi ký: nếu tôi đã có ERP/CRM/hệ chấm công riêng, tôi nối vào Ebig ở đâu, qua giao thức gì, ai giữ khoá bí mật? Trang này trả lời bằng đường dẫn và cấu hình đang chạy.
Api/Gateway/README.md, Api/SSO/AUTH.md mục 3, Api/README.md §4.Bốn worker nghiệp vụ phía sau, không ai lộ ra internet
4 worker phía sau đặt không mở đường công khai, không có domain công khai — không gọi được từ internet bằng bất kỳ cách nào khác ngoài chính Gateway. Bề mặt tấn công từ bên ngoài chỉ có đúng một điểm. Nguồn: Api/Gateway/README.md.
Chuẩn tích hợp danh tính là OAuth2/OIDC đầy đủ
Có GET /.well-known/openid-configuration (discovery) nên client dùng thẳng thư viện OIDC có sẵn — oidc-client-ts, next-auth, Spring Security — không cần viết riêng bộ xác thực, không cần cấu hình tay.
| Endpoint | Mô tả |
|---|---|
GET /oauth2/authorize | Authorization Code + PKCE |
POST /oauth2/token | authorization_code, refresh_token |
GET /oauth2/userinfo | Claim theo Bearer access token |
GET /oauth2/jwks | Khoá công khai để resource server tự verify |
POST /oauth2/revoke | Thu hồi refresh token (RFC 7009) |
GET /oauth2/logout | RP-Initiated Logout |
Hai loại client đã phân biệt rõ: web (có thể có client_secret) và native (app di động, không bao giờ có secret, dùng lược đồ URI riêng co.ebig.dx://oauth2redirect theo đúng RFC 8252). PKCE bắt buộc S256 cho cả hai, redirect_uri khớp tuyệt đối. Client di động thật đang chạy: ebig-dx-mobile, đăng ký qua Api/SSO/scripts/register-mobile-client.mjs.
Nguồn: Api/SSO/AUTH.md mục 3.
Đây là điểm neo kỹ thuật để nối hệ cũ vào Ebig
Một bản ghi project mang cả domain[], ggClientId, tenantEnforce, secretSalt+secretHash — secret không bao giờ lưu bản rõ, chỉ salt + hash.
Nguồn: Api/SSO/AUTH.md §7, Api/BOUNDARY-CONFLICT-REPORT.md (khảo sát 23/08, câu 1).
/api/data/:module
Mỗi dự án có không gian khoá riêng data:<pid>:<Module>. Route này mở cho cả admin, user, customer.
pid xác định bằng hostname tra trong kho khoá–giá trị domains — header client tự khai không bao giờ được tin một mình: đứng trên domain của dự án thì header repo phải khớp pid đó, lệch là từ chối (403); hostname chưa khai trong domains thì pid client khai phải qua bước kiểm thành viên ở SSO. Đây đúng là lỗ giả danh mà bản cũ của SSO từng có (client tự gửi customerId/repo và được tin thẳng).
Api/README.md §5.1, §3 GĐ 0 ①, §5.12 · Api/Gateway/src/tenant.js (bindTenant).White-label (domain riêng của khách): tên miền riêng cho khách đã có trong gói, nhưng worker quản trị chưa phủ API cấp tên miền riêng. Luồng "khách trỏ CNAME riêng → Ebig tự cấp chứng chỉ → ghi domain vào kho khoá–giá trị" hôm nay còn phải làm tay một phần.
Nguồn: Api/Gateway/README.md (bảng định tuyến), Api/README.md §5.1 và §3 GĐ 0 ① (cách xác định pid), mục Q2, §4 quyết định #1, §5.7-§5.8 (domain riêng).
Đây là ví dụ thị trường có thật, không phải Ebig tự vẽ đối thủ
| Dự án viễn thông tham chiếu (thật, đã đo) | Ebig (thật, theo mã đang chạy) |
|---|---|
| Chuỗi linked-server 147→28→56 máy chủ, một mắt xích lỗi làm gãy cả chuỗi; job đọc dữ liệu lúc 3:00 trong khi job nạp chạy 6:15 → NULL âm thầm mỗi ngày | Một đường xác thực + chuyển tiếp duy nhất (Gateway → Local), không có đường vòng nào giữa các worker nghiệp vụ |
| sMartF đọc thẳng DB Oracle của sMartW ở 7 điểm — đổi lược đồ một bên là hỏng hệ bên kia | Local/CSDL trong bộ nhớ/nền tảng biên/Service không lộ ra internet, chỉ gọi qua liên kết worker nội bộ có kiểm soát; đối chiếu hai đầu repo/pid giữa Gateway và Local |
| Nạp dữ liệu bằng DELETE→INSERT — lỗi giữa chừng là mất dữ liệu vĩnh viễn | Ghi log bắt buộc mọi thao tác dữ liệu (Local/controller/datacontroller.js) |
~32 thông tin xác thực production (tài khoản sa, khoá SSH, khoá mã hoá app, service account Firebase) nằm plaintext trong code | Secret quản lý qua lệnh quản lý bí mật của nền tảng; client_secret/project secret chỉ lưu dạng salt+hash, hiện nguyên văn đúng một lần lúc tạo |
Nguồn: hồ sơ kỹ thuật dự án tham chiếu (dự án viễn thông tham chiếu) đối chiếu với mã nguồn Ebig hiện tại.
Chưa có — lộ trình, không phải đang chạy
Chưa có cơ chế webhook/đẩy sự kiện ra hệ thống khách. Tích hợp thời gian thực hôm nay phải tự polling /api/data/:module, chưa có đường đẩy chủ động.
Gateway tự nhận "Chưa làm" trong README nội bộ. Frontend của khách chạy trên domain riêng, gọi thẳng API Ebig từ trình duyệt, cần Ebig bật CORS riêng cho domain đó trước — chưa tự phục vụ được.
SSO tự giới hạn luồng đăng nhập, nhưng Gateway chưa chặn gì cho các đường còn lại. Không có số SLA/rate-limit công bố cho /api/data/*.
Khách tự định nghĩa bảng/trường riêng qua API (:tbl, :col, :rel) — 0 dòng mã, đang ở giai đoạn thiết kế. Hôm nay tích hợp qua 18 module cố định.
Cũng chưa tìm thấy catalogue connector cho hệ cũ (không có cầu nối JDBC/SFTP/ESB kiểu bộ thu thập dữ liệu của dự án tham chiếu). Ebig tích hợp qua OAuth2/OIDC + REST — nếu hệ cũ của bạn chỉ nói được giao thức khác (SOAP, file batch…), đây là việc phải thiết kế riêng, chưa có sẵn. Không có tài liệu OpenAPI/Swagger công khai cho /api/data/:module trong repo — khách muốn tích hợp hôm nay cần làm việc trực tiếp với đội Ebig để lấy đặc tả.