Ebig
Liên hệ tư vấn
Dành cho CTO — đường dẫn, giao thức, và nơi giữ khoá bí mật

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.

Hệ thống bạn đã cóGiao thức Ebig nói đượcVào cửa nào, tới đâuERPCRMHệ chấm côngWeb / app di độngOAuth2 / OIDCdanh tính · PKCE bắt buộc S256GET /.well-known/openid-configurationREST/api/data/:modulemở cho admin · user · customerGateway Workerworker duy nhất códomain công khai18 module cố địnhdata:<pid>:<Module>không gian khoá riêng mỗi dự ánChưa có sẵnGiao thức khác — SOAP, file batch, cầu nối JDBC/SFTP/ESB — phải thiết kế riêng, chưa có sẵn.Hệ thống bạn đã cóERPCRMHệ chấm côngWeb / app di độngGiao thức Ebig nói đượcOAuth2 / OIDCdanh tính · PKCE bắt buộc S256GET /.well-known/openid-configurationREST/api/data/:modulemở cho admin · user · customerGateway Workerworker duy nhất có domain công khai18 module cố địnhdata:<pid>:<Module>không gian khoá riêng mỗi dự ánChưa có sẵnGiao thức khác — SOAP, file batch,cầu nối JDBC/SFTP/ESB:phải thiết kế riêng.
Hai giao thức, một cửa — và một dải nói thẳng cái chưa có. Nguồn: Api/Gateway/README.md, Api/SSO/AUTH.md mục 3, Api/README.md §4.
Một cửa duy nhất, không phải nhiều đường vòng

Bốn worker nghiệp vụ phía sau, không ai lộ ra internet

Internet
Khách hàng, hệ thống cũ
→
Gateway Worker
Worker DUY NHẤT có custom domain công khai
→
liên kết worker nội bộ (worker-to-worker, không qua internet)
SSO Local CSDL trong bộ nhớ nền tảng biên Service

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.

Đăng nhập một lần, chuẩn mở, không phải hàng tự chế

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.

EndpointMô tả
GET /oauth2/authorizeAuthorization Code + PKCE
POST /oauth2/tokenauthorization_code, refresh_token
GET /oauth2/userinfoClaim theo Bearer access token
GET /oauth2/jwksKhoá công khai để resource server tự verify
POST /oauth2/revokeThu hồi refresh token (RFC 7009)
GET /oauth2/logoutRP-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.

Dự án của bạn = một OAuth client

Đây là điểm neo kỹ thuật để nối hệ cũ vào Ebig

Tạo project
POST /api/projects
→
Nhận cặp định danh
projectId + clientSecret (hiện đúng 1 lần)
→
Gọi API qua Gateway
Mọi lệnh gọi sau đó xác thực bằng cặp này

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).

Bề mặt dữ liệu cho tích hợp

/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).

Đường 1 — hostname có trong domainsYêu cầu tớihostname của yêu cầuTra kho khoá–giá trịdomainspidmã dự ánDữ liệudata:<pid>:<Module>Đứng trên domain nào thì thuộc dự án đó — header repo phải khớp, lệch là 403.Đường 2 — hostname chưa khai trong domainsHeader clientcustomerId / repopid client khai — chưa được tinKiểm thành viên ở SSOghi log; chặn khi bật cờqua được thì mới ra pidHeader client tự khai không bao giờ được tin một mình: phải khớp pid suy từ domain, hoặc phải qua kiểm thành viên.Đây đúng là lỗ giả danh mà bản cũ của SSO từng có (client tự gửi customerId/repo).Đường 1 — hostname có trong domainsYêu cầu tớihostname của yêu cầuTra kho khoá–giá trịdomainspidmã dự ánDữ liệudata:<pid>:<Module>Đứng trên domain nào thì thuộc dự án đó— header repo phải khớp, lệch là 403.Đường 2 — hostname chưa khai ở đóHeader clientcustomerId / repoKiểm thành viên ở SSOghi log; chặn khi bật cờqua được thì mới ra pidHeader client tự khai không bao giờ đượctin một mình: phải khớp pid suy từdomain, hoặc phải qua kiểm thành viên.Đây đúng là lỗ giả danh mà bản cũcủa SSO từng có.
Lời khai của client không bao giờ đủ một mình. Nguồn: 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).

Đối chiếu với cách làm cũ ngoài thị trườ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àyMộ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 kiaLocal/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ễnGhi 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 codeSecret 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.

Cái chưa có

Chưa có — lộ trình, không phải đang chạy

① WEBHOOK / ĐẨY SỰ KIỆN

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.

② CORS CHO DOMAIN RIÊNG CỦA KHÁCH

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.

③ RATE-LIMIT / SLA Ở TẦNG GATEWAY

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/*.

④ SCHEMA ĐỘNG CHO KHÁCH TỰ ĐỊNH NGHĨA

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ả.

Đội kỹ thuật Ebig ngồi cùng bạn vẽ đúng luồng tích hợp

Gửi hệ thống cần nối