Files
member-platform/docs/BACKEND_ARCHITECTURE.md

99 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# memberapi.ose.tw 後端架構FastAPI
## 1. 目標與邊界
- 網域:`memberapi.ose.tw`
- 角色會員中心後端真相來源Member + Organization + Permission
- 範圍:
- user/member 管理(以 `authentik_sub` 為跨系統主鍵)
- organization 管理
- member-organization 關聯管理
- permission grant/revoke 與 snapshot
- internal 查詢 API 提供其他系統
- 不在本服務處理:
- 前端 UI/互動流程
- Authentik hosted login page 本身
## 2. 技術棧
- Python 3.12
- FastAPI
- SQLAlchemy 2.0
- PostgreSQLpsycopg
- Pydantic Settings
## 3. 後端目錄
- `backend/app/main.py`
- `backend/app/api/`
- `auth.py`
- `me.py`
- `admin.py`permission
- `admin_entities.py`member/org
- `internal.py`
- `internal_entities.py`
- `backend/app/models/`
- `user.py`
- `permission.py`
- `organization.py`
- `member_organization.py`
- `api_client.py`
- `backend/app/repositories/`
- `users_repo.py`
- `permissions_repo.py`
- `organizations_repo.py`
- `member_organizations_repo.py`
## 4. 資料模型
- `users`
- `id`, `authentik_sub`(unique), `authentik_user_id`, `email`, `display_name`, `is_active`, timestamps
- `permissions`
- `id`, `user_id`, `scope_type`, `scope_id`, `module`, `action`, `created_at`
- unique: `(user_id, scope_type, scope_id, module, action)`
- `organizations`
- `id`, `org_code`(unique), `name`, `tax_id`, `status`, timestamps
- `member_organizations`
- `id`, `member_id`, `organization_id`, `created_at`
- unique: `(member_id, organization_id)`
- `api_clients`(由 `docs/API_CLIENTS_SQL.sql` 建立)
- `client_key`, `api_key_hash`, `status`, allowlist, expires/rate-limit 欄位
## 5. API 設計
- 健康檢查
- `GET /healthz`
- 登入
- `GET /auth/oidc/url`
- `POST /auth/oidc/exchange`
- 使用者路由Bearer
- `GET /me`
- `GET /me/permissions/snapshot`
- 管理路由(`X-Client-Key` + `X-API-Key`
- `POST /admin/permissions/grant`
- `POST /admin/permissions/revoke`
- `GET|POST|PATCH /admin/organizations...`
- `GET|POST|PATCH /admin/members...`
- `GET|POST|DELETE /admin/members/{member_id}/organizations...`
- 內部路由(`X-Internal-Secret`
- `POST /internal/users/upsert-by-sub`
- `GET /internal/permissions/{authentik_sub}/snapshot`
- `POST /internal/authentik/users/ensure`
- `GET /internal/members`
- `GET /internal/members/by-sub/{authentik_sub}`
- `GET /internal/organizations`
- `GET /internal/organizations/by-code/{org_code}`
- `GET /internal/members/{member_id}/organizations`
## 6. 安全策略
- `admin` 路由API client 驗證status/過期/hash/allowlist
- `internal` 路由:`X-Internal-Secret`
- `me` 路由Auth token + JWKS 驗簽
- `/me` 補值:若 token 無 `email/name`,會呼叫 `userinfo` 補齊
## 7. 與其他系統資料流
1. 其他系統登入後,以 token `sub` 呼叫 `/internal/users/upsert-by-sub`
2. 需要組織/會員資料時,走 `/internal/members*``/internal/organizations*`
3. 權限查詢走 `/internal/permissions/{sub}/snapshot`
4. 後台人員調整權限走 `/admin/permissions/grant|revoke`
## 8. 下一階段建議
- 導入 Alembic migration
- 加 audit log誰在何時做了 member/org/permission 變更)
- 補上整合測試與 rate-limit metrics