Files
member-platform/docs/BACKEND_ARCHITECTURE.md

3.2 KiB
Raw Blame History

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.pypermission
    • admin_entities.pymember/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