Bỏ qua

E-005 — Ứng dụng và cấp quyền

Nguồn: PRD prd-openapi-platform-2026-09-04 §5 (F14, F15, F4) · spine architecture-openapi-platform-2026-09-04 (AD-3, AD-10, AD-12, AD-20, AD-21) · story chi tiết + AC ở _bmad-output/planning-artifacts/epics.md (mục Epic E-005). PO duyệt cấu trúc epic + ô parity: 05/09/2026 — duyệt cả danh sách epic và bảng story.

Đường duy nhất quyền ra đời: bên thứ ba tạo ứng dụng, đăng ký một sản phẩm cho một môi trường, ngân hàng duyệt và kích hoạt.

Vì sao làm — BRD tầng epic

Mục tiêu. Bên thứ ba tạo ứng dụng, đăng ký một sản phẩm cho một môi trường, và nhận credential. Đây là đường duy nhất quyền ra đời.

Nhóm yêu cầu trong PRD — F14, F15, F4

F14 — Ứng dụng của bên thứ ba

  • FR-088 Ứng dụng là thực thể riêng nằm giữa Tổ chức và credential: tên, mã, tổ chức sở hữu, trạng thái, môi trường triển khai, người tạo, người phê duyệt, ngày tạo.
  • FR-089 Một tổ chức có nhiều ứng dụng; mỗi ứng dụng có credential riêng (F4).
  • FR-090 Môi trường triển khai của ứng dụng là một chiều riêng, khác với môi trường được cấp quyền ở F15 — PO chốt 05/09 giữ cả hai chiều.
  • FR-091 Ứng dụng chỉ tạo được cho tổ chức đã được duyệt (F2).
  • FR-092 Đình chỉ một ứng dụng độc lập với đình chỉ cả tổ chức — hai mức khác nhau.
  • FR-093 Chấm dứt hợp đồng với tổ chức kéo theo vô hiệu mọi ứng dụng của tổ chức đó.
  • FR-094 Danh sách ứng dụng lọc theo tổ chức, môi trường, trạng thái; phân trang.

F15 — Yêu cầu đăng ký sản phẩm API

Đây là quy trình duyệt thứ hai, khác hẳn onboard tổ chức ở F2, và là việc hằng ngày của trang quản trị.

  • FR-095 Bên thứ ba tạo yêu cầu đăng ký cho bộ ba Ứng dụng × Sản phẩm API × Môi trường.
  • FR-096 Mã yêu cầu sinh theo quy tắc nhận diện được, mang ứng dụng và môi trường.
  • FR-097 Yêu cầu mang: tổ chức, ứng dụng, sản phẩm đăng ký, người liên hệ, người nộp, thời điểm nộp, môi trường.
  • FR-098 Trạng thái: Chờ duyệt → (Đã duyệt | Từ chối), và tiến trình ba bước Tạo yêu cầu → Phê duyệt → Kích hoạt đăng ký. Kích hoạt là bước riêng: duyệt xong chưa chắc đã hiệu lực ngay.
  • FR-099 Cùng một ứng dụng đăng ký nhiều môi trường độc lập — duyệt UAT không kéo theo duyệt Production, và từ chối một môi trường không ảnh hưởng môi trường kia.
  • FR-100Chặn cứng (TT-01): duyệt yêu cầu mà sản phẩm suy ra nhóm PIS hoặc EWLTS chỉ được nếu tổ chức thuộc loại Ngân hàng hoặc Tổ chức trung gian thanh toán. Kiểm lại tại đúng thời điểm duyệt, vì cả loại pháp nhân lẫn nội dung sản phẩm đều đổi được.
  • FR-101 Duyệt hoặc từ chối đi qua mô hình maker/checker ở F3; từ chối bắt buộc nêu lý do và lý do đó hiển thị cho bên thứ ba.
  • FR-102 Yêu cầu được duyệt và kích hoạt sinh ra bản ghi quyền (F4, FR-025) — đây là cách duy nhất quyền ra đời.
  • FR-103 Danh sách yêu cầu lọc theo trạng thái, tổ chức, môi trường; phân trang.

F4 — Cấp quyền truy cập và credential

  • FR-025 ⚠️ Sửa 05/09. Quyền truy cập không gán trực tiếp cho bên thứ ba theo bốn nhóm nữa. Quyền là kết quả của một yêu cầu đăng ký được duyệt: Ứng dụng × Sản phẩm API × Môi trường (F15). Bốn nhóm INF/AIS/PIS/EWLTS vẫn tồn tại, nhưng là phân loại pháp lý suy từ nhãn của API (FR-070), không phải đơn vị cấp phát.
  • FR-026Chặn cứng (TT-01): yêu cầu đăng ký một Sản phẩm API mà nhóm suy ra có PIS hoặc EWLTS chỉ duyệt được nếu tổ chức sở hữu ứng dụng thuộc loại Ngân hàng hoặc Tổ chức trung gian thanh toán. Kiểm ở tầng nghiệp vụ phía máy chủ, chạy lại tại thời điểm duyệt.
  • FR-027 Cấp client_id cho TPP.
  • FR-028 Sinh client_secret, hiển thị đúng một lần, lưu dạng băm không đảo ngược được.
  • FR-029 Xoay vòng client_secret với thời gian chuyển tiếp cho phép hai secret cùng sống.
  • FR-030 Đăng ký danh sách redirect_uri hợp lệ cho TPP (bắt buộc cho luồng AIS/PIS về sau).
  • FR-031 ⚠️ Sửa 05/09. Hạn mức có hai nguồn khác bản chất, cùng tồn tại:
  • Hạn mức thương mại nằm trong Gói đăng ký (hạn mức, tần suất, kèm giá) — điều khoản bán hàng, khác nhau theo gói (FR-084).
  • Trần pháp lý theo Điều 11.9 — giới hạn truy vấn tự động thông tin khách hàng, áp cho mọi bên thứ ba bất kể mua gói nào.

Cái nào chặt hơn thì cái đó thắng. Không được để một gói đắt tiền nâng hạn mức vượt trần pháp lý. Admin đặt cả hai giá trị; portal-be thi hành giá trị nhỏ hơn. - FR-032 Tách credential môi trường thử nghiệm và môi trường thật. [ASSUMPTION C6] Chưa rõ sandbox chạy hạ tầng riêng hay dùng chung.

Bảng story → change

Story Service Thứ tự bắt buộc Ghi chú Chặn bởi
E-005/1.1 Schema Ứng dụng admin-be 1 cap/tpp-application · thực thể giữa Tổ chức và credential · PO chốt 12/09: chiều 1 «Giai đoạn triển khai» = DEVELOPMENT · SANDBOX · PRODUCTION (giữ hệ cũ), chỉ mô tả + lọc (FR-094), ⛔ không điều khiển quyền M:E-004/1.1 · M:E-001/1.1
E-005/2.1 Schema Yêu cầu đăng ký và Quyền admin-be 2 cap/api-registration-review · REGISTRATION là sổ cái chỉ ghi thêm · PO chốt 12/09: chiều 2 «Môi trường cấp quyền» = UAT · PRODUCTION; ⛔ Sandbox không phải giá trị đăng ký (mở cho mọi ứng dụng hoạt động đã nộp đăng ký, không cần duyệt — xem bảng «hai chiều» dưới) M:E-005/1.1 · M:E-003/1.1
E-005/2.2 Chặn theo loại pháp nhân admin-be 3 cap/api-registration-review · ⛔ AD-21 lớp 1, 2, 4 M:E-005/2.1 · M:E-004/1.1 · M:E-002/1.6
E-005/2.3 Duyệt và kích hoạt admin-be 4 cap/api-registration-review · kích hoạt là bước riêng M:E-005/2.2 · M:E-001/3.1 · TR:E-007/1.2 trước lần kích hoạt THẬT
E-005/3.1 Cấp và lưu credential admin-be 5 cap/tpp-credential · ⛔ Argon2id, KHÔNG bcrypt · ⚠️ hai câu chưa chốt, hỏi PO trước khi mở change (12/09): ① credential sandbox cấp lúc nào (đề xuất: khi ứng dụng được duyệt) · ② UAT và PRODUCTION chung hay riêng bộ credential thật (AD-6 chỉ tách sandbox/thật) M:E-005/2.3 · M:E-005/1.1
E-005/1.5 Khai bảng đơn khai ứng dụng admin-be 6 cap/schema-migration · ⛔ vật mang của E-005/1.2 · AD-14: bảng portal-be GHI vẫn do admin-be KHAI · ⚠️ khác bảng Ứng dụng chính thức ở 1.1 M:E-001/1.1 · TK:E-005/1.2
E-005/1.2 Đơn khai ứng dụng portal-be 7 cap/tpp-application-request · ghi bảng đơn, ⛔ không ghi bản chính thức · chặn tới khi 1.5 xong · ⛔ PO chốt 11/09 tối (P6 BÁC): đơn chỉ lập được khi tổ chức của người dùng ĐÃ ĐƯỢC DUYỆT — đơn gắn to_chuc_id, ⛔ không gắn người/hồ sơ rồi nối sau; người chưa có tổ chức duyệt gọi tạo đơn nhận 403 theo phong bì AD-16 M:E-005/1.5 · M:E-004/2.8 · M:E-004/2.5
E-005/2.5 Nộp yêu cầu đăng ký portal-be 8 cap/api-registration-request · đọc danh mục đã xuất bản · ghi REGISTRATION do 2.1 khai — ⚠️ xác nhận bằng số đo trước khi mở change M:E-005/2.1 · M:E-004/2.8 · ⚠️THIẾU VẬT MANG: GRANT danh mục+sản phẩm
E-005/3.4 Khai bảng đơn yêu cầu xoay khoá admin-be 9 cap/schema-migration · ⛔ vật mang của E-005/3.3 · AD-14 · ⚠️ khác bảng credential ở 3.1 M:E-001/1.1 · TK:E-005/3.3
E-005/3.3 Yêu cầu xoay khoá portal-be 10 cap/tpp-self-service · tạo đơn, không tự xoay · chặn tới khi 3.4 xong M:E-005/3.4 · M:E-005/3.1 · ⚠️THIẾU VẬT MANG: GRANT credential
E-005/1.3 Màn Ứng dụng phía ngân hàng admin-fe 11 cap/admin-console-ui M:E-005/1.1 · M:E-001/5.5
E-005/2.4 Màn Yêu cầu đăng ký admin-fe 12 cap/admin-console-ui · ⛔ nút Phê duyệt vô hiệu kèm giải thích ngay khi mở màn M:E-005/2.2 · M:E-001/5.5
E-005/1.4 Màn Ứng dụng phía bên thứ ba portal-fe 13 cap/tpp-portal-ui · chỉ thấy của tổ chức mình, ràng buộc theo hàng · PO chốt 11/09 tối (P6 BÁC): người chưa có tổ chức duyệt thấy màn rỗng có hướng dẫn («tổ chức đang chờ thẩm định») đọc từ 1.2 trả rỗng — ⛔ không tự khai giả, ⛔ không nút Tạo · PO chốt 12/09: MỞ RỘNG AC — gồm cả Chi tiết ứng dụng (màn riêng AppDetailScreen, UX-DR13) và modal Tạo ứng dụng (CreateAppModal, nộp đơn qua 1.2); gói CCS lượt 12/09 M:E-005/1.2 · M:E-001/5.6
E-005/2.6 Màn đăng ký sản phẩm portal-fe 14 cap/tpp-portal-ui · nhắc hiệu lực chỉ ở một môi trường · PO chốt 12/09: SỬA AC — wizard năm bước (thêm bước 1 Chọn ứng dụng, đúng bộ ba FR-095) và ApiList danh sách API trong sản phẩm (nhãn nhóm TT64, cảnh báo PIS/EWLTS) ghép vào story này; gói CCS lượt 12/09 M:E-005/2.5 · M:E-001/5.6 · ⚠️THIẾU VẬT MANG: GRANT danh mục+sản phẩm (S2)
E-005/3.2 Màn khoá truy cập portal-fe 15 cap/tpp-portal-ui · ⛔ màn rủi ro cao nhất, secret hiện một lần M:E-005/3.1 · M:E-001/5.6
E-005/2.8 Đọc đặc tả API theo đăng ký portal-be 16 cap/api-registration-request · PO duyệt 12/09 · trả đặc tả đã xuất bản của API thuộc sản phẩm ứng dụng đã đăng ký + trạng thái mở từng môi trường (Sandbox: ứng dụng hoạt động + đã nộp đăng ký, không cần duyệt; UAT/PRODUCTION: đăng ký đúng môi trường đã kích hoạt) M:E-002/1.8 · M:E-005/2.5 · ⚠️THIẾU VẬT MANG: GRANT danh mục+sản phẩm (S2)
E-005/2.7 Màn Chi tiết API portal-fe 17 cap/tpp-portal-ui · PO duyệt 12/09 · sáu khối của gói (ApiDetailScreen); khối Gọi thử là E-009/1.4, ⛔ không thuộc story này M:E-005/2.8 · M:E-005/1.4 · M:E-005/2.6
Chiều Nhãn trên màn Giá trị Điều khiển
--- --- --- ---
của Ứng dụng (FR-090) Giai đoạn triển khai DEVELOPMENT · SANDBOX · PRODUCTION chỉ mô tả + lọc
của Đăng ký (FR-095/FR-099) Môi trường cấp quyền UAT · PRODUCTION quyền gọi API thật, mỗi môi trường một đăng ký
Sandbox không thuộc chiều nào mở cho mọi ứng dụng đang hoạt động, không cần đăng ký được duyệt — scope = sản phẩm ứng dụng đã nộp đăng ký (kể cả chờ duyệt; lớp chặn 2.2 vẫn áp lúc nộp nên AD-21 không hở) (Điều 9 · FR-106); credential sandbox tách theo AD-6

Bổ sung 12/09/2026 (PO duyệt) — mở rộng 1.4, sửa 2.6 theo gói CCS lượt 2 (design/ @ 5ed1cc6). Gói vẽ luồng Ứng dụng → Chi tiết ứng dụng → Đăng ký sản phẩm → Danh sách API → Chi tiết API → Gọi thử. PO chốt 12/09 ba điều áp ngay, ⛔ không mở story mới cho ba điều này:

  • 1.4 gồm cả màn Chi tiết ứng dụng (AppDetailScreen, màn riêng theo UX-DR13, có card «Sản phẩm đã đăng ký» đọc REGISTRATION của tổ chức mình — hàng 11 AD-20, vẫn ⚠️THIẾU VẬT MANG S1–S3) và modal Tạo ứng dụng (CreateAppModal, nộp đơn qua 1.2; Redirect URI bắt buộc — mục 3.1 Thông tư 64 đòi redirect_uri khớp giá trị đã khai). Nhánh «tổ chức chưa duyệt → màn rỗng, không nút Tạo» gói chưa vẽ — đã vào bản kê gửi CCS 12/09; làn portal-fe dựng theo AC, ⛔ không chờ hình.
  • 2.6 wizard năm bước (Chọn ứng dụng → Chọn sản phẩm → Chọn gói → Môi trường → Xác nhận); vào từ Chi tiết ứng dụng thì mở ở bước 2. ApiList (danh sách API trong sản phẩm: method · đường dẫn · subdomain · nhãn nhóm TT64 · cảnh báo khoản 3 Điều 5 khi có PIS/EWLTS) là một phần của 2.6, dùng ở bước chọn sản phẩm, bước xác nhận và trong Chi tiết ứng dụng. Nó đọc danh mục đã xuất bản qua 2.52.6 kế thừa ⚠️THIẾU VẬT MANG GRANT danh mục+sản phẩm (S2).
  • Gói nêu «mâu thuẫn»: cột Môi trường của ứng dụng chọi bước chọn môi trường của đăng ký. ⛔ Không phải mâu thuẫnFR-090 PO chốt 05/09 giữ hai chiều (môi trường triển khai của ứng dụng ≠ môi trường được cấp quyền của đăng ký). Chỗ hở thật là tập giá trị của mỗi chiều (câu hỏi mở PRD) — đang trình PO.

Bổ sung 12/09/2026 chiều (PO duyệt từng dòng) — 2.7 · 2.8 và hai chiều môi trường. PO mở Chi tiết APIGọi thử vào GĐ1 (PRD §2 phi mục tiêu ghi PO SỬA 12/09). Chi tiết API = 2.8 (portal-be đọc đặc tả từ E-002/1.8) + 2.7 (portal-fe); Gọi thử ở E-009 (đã chia story cùng ngày). Thứ tự ship: UU-TIEN-GD1 §B B6–B7, sau B3–B5. Hai chiều môi trường chốt theo số đo hệ cũ (docs/mo-hinh-tu-portal-cu.md §3.2):

Chiều Nhãn trên màn Giá trị Điều khiển
của Ứng dụng (FR-090) Giai đoạn triển khai DEVELOPMENT · SANDBOX · PRODUCTION chỉ mô tả + lọc
của Đăng ký (FR-095/FR-099) Môi trường cấp quyền UAT · PRODUCTION quyền gọi API thật, mỗi môi trường một đăng ký
Sandbox không thuộc chiều nào mở cho mọi ứng dụng đang hoạt động, không cần đăng ký được duyệt — scope = sản phẩm ứng dụng đã nộp đăng ký (kể cả chờ duyệt; lớp chặn 2.2 vẫn áp lúc nộp nên AD-21 không hở) (Điều 9 · FR-106); credential sandbox tách theo AD-6

2.6 bước Môi trường chỉ còn UAT · PRODUCTION; gói vẽ ba giá trị là lệch có chủ ý, làn portal-fe ghi NGUON.md. Câu hỏi mở PRD «tập giá trị mỗi chiều» đóng bằng bảng này.

Bổ sung 08/09/2026 (PO duyệt) — E-005/1.53.4, hai cặp thiếu cùng dạng E-004/1.6. Phát hiện khi soát 11 epic ngày 08/09. AD-14 buộc mọi bảng do admin-be khai, kể cả bảng portal-be ghi; nhưng hai story portal-be dưới đây ghi bảng mà không story nào khai:

  • 1.2 ghi «bảng đơn, không ghi bản chính thức» — mà 1.1 chỉ khai Ứng dụng chính thức. Hai bảng khác nhau; AC nói thẳng điều đó và vẫn không ai bắt được.
  • 3.3 «tạo đơn yêu cầu xoay khoá» — mà 3.1 khai credential, không khai bảng đơn.

⚠️ 2.5 không nằm trong nhóm này: nó ghi REGISTRATION, bảng 2.1 đã khai. Ghi ra vì ba story trông giống nhau («ghi bảng đơn») nhưng chỉ hai cái thiếu nhà — ⛔ đừng mở story thứ ba cho đủ bộ.

⚠️ Ma trận quyền portal_app là một nửa của mỗi story khai bảng, không phải phần phụ: portal-be có cổng khởi động đo quyền theo cột, thiếu GRANT đúng thì nó từ chối khởi động và triệu chứng trông như lỗi của portal-be.

2.2 phải xong trước 2.3. Duyệt mà chưa có lớp chặn là mở đúng cái cửa mà AD-21 dựng để đóng.

3.2 là story cần soi kỹ nhất trong cả epic: một lần đóng nhầm màn là một vòng phê duyệt nữa.

⚠️ THIẾU VẬT MANG — bốn hàng ma trận AD-20 chưa có chủ (đo 08/09/2026). Khác với hai cặp 1.5/3.4 ở trên (thiếu bảng), bốn chỗ này thiếu câu GRANT và vế hợp đồng: 2.5 đọc danh mục+sản phẩm đã xuất bản (hàng 8) · 3.3 đọc CREDENTIAL (hàng 2) · 1.4 đọc APPLICATION chỉ của tổ chức mình (hàng 9) · REGISTRATION chỉ của tổ chức mình (hàng 11). ⛔ Và cơ chế ràng buộc theo HÀNG chưa có nhà ở tầng dữ liệu: quét 82 story, cụm «ràng buộc theo hàng» xuất hiện đúng một lần — ở 1.4, một story portal-fe. Trục T_iso cấm đúng điều đó («ở tầng dữ liệu, không phải lọc ở giao diện»). ⛔ Đề nghị S1, S2, S3 đang chờ PO duyệt, xem docs/ra-soat-kien-truc-2026-09-08.md.


Các nhóm việc (feature)

Hệ Admin

Hệ Portal