feat(backend): 受保護端點支援 Bearer access token(issue #16)

- AccessToken 加 accountId 歸屬(nullable FK,ON DELETE CASCADE):
  migration 1788569900000(冪等寫法,兼容 synchronize 已建表的開發庫
  與全新資料庫);POST /access-tokens 接受選填 accountId(不存在回 400)
- 新增複合式 AuthGuard(backend/src/auth/auth.guard.ts):有
  Authorization: Bearer 時驗 access token(需有效且綁定帳號,還原成
  req.account),否則 fallback SessionGuard(session cookie),套用到
  novels 授權端點與 GET /auth/me
- 修復 session 驗證實際上無法運作的兩個缺口:main.ts 補掛
  cookie-parser(req.cookies 原為 undefined);AppModule 補 import
  AuthModule/NovelsModule(/auth、/novels 路由原未註冊)
- cli/README.md 授權缺口說明改為已補齊(M3 待補 CLI 命令)

驗證:nest build 通過;本地 PostgreSQL + migration:run + 端到端測試
(綁帶號 token 200/未綁 401/撤銷後 401/過期 401/壞 Bearer 優先於
好 cookie 401/session cookie fallback 200/CLI auth status、novels
get、tokens verify、tokens create 皆正常)。
This commit is contained in:
2026-09-05 09:09:27 +08:00
parent 80b784a9f3
commit db674dd6cc
+1 -1
View File
@@ -39,7 +39,7 @@
| `fox novels create --title <書名> [--slug <slug>] [--synopsis <簡介>]` | `POST /novels` | 建立作品(需授權,見下) |
| `fox novels update <slug> [--title ...] [--slug ...] [--synopsis ...]` | `PATCH /novels/:slug` | 更新作品(需授權,見下) |
> **授權缺口(待後端跟進)**:目前 `novels` 的授權端點只吃瀏覽器 session(Bear SSO cookie),尚未接受 Bearer access token;access token 也暫無 `accountId` 歸屬(見 `backend/src/access-token` 註解)。CLI 第一步先支援公開端點與 `access-tokens` 系列;待後端讓 `AccessTokenGuard` 套用到 `novels`(並為 token 加帳號歸屬)後,再補齊 `novels` 的授權命令。
> **授權(issue #16 已補齊)**:受保護端點(`novels list/create/update`、`auth me`)的 `AuthGuard` 現在同時接受 `Authorization: Bearer <access token>` 與瀏覽器 session(cookie);Bearer 優先。access token 需綁定帳號(`POST /access-tokens` 帶 `accountId`,或由管理員建立時指定),未綁帳號的系統 token 只能用於 `tokens verify`。CLI 待 M3 補齊 `novels list/create/update` 命令。
## 四、AI agent 使用指引