Uninote
Uninote
用户根目录
brdr
common
programming
docs
tests
后端试题
问题讨论

管理后台 API

管理前端位于相邻的 mynote-admin 项目。管理 API 和现有 /v1 同步 API 由同一个服务提供,共享 SQLite 和对象存储。

服务配置

使用 Node.js 24,并在部署前执行 npm ci 和 npm run build。

变量 用途
MYNOTE_ADMIN_USERNAME 独立管理员用户名
MYNOTE_ADMIN_PASSWORD_HASH scripts/admin-password-hash.ts 从 stdin 生成的 scrypt salt:hash
MYNOTE_ADMIN_ORIGIN 正式后台完整 origin,例如 https://admin.example.com,不带尾部斜杠

用户名与哈希必须同时配置;完全未配置时管理功能关闭,管理接口返回 503。配置错误会阻止服务启动。修改配置后必须重启同步服务。

生成哈希时从 stdin 输入至少 12 个字符的密码,不把密码放在命令参数中。管理前端 README 提供 zsh 隐藏输入和本地启动示例。

接口

方法 路径 返回
POST /admin/v1/login 接收 { username, password },返回 { username },设置会话 Cookie
GET /admin/v1/session { username }
POST /admin/v1/logout 撤销会话并清除 Cookie
GET /admin/v1/overview 与现有 store.metrics 相同的计数
GET /admin/v1/accounts?page=1&pageSize=20 { items, total, page, pageSize }
GET /admin/v1/libraries?page=1&pageSize=20 { items, total, page, pageSize }

分页大小范围 1–100,页码范围 1–1000000,按创建时间倒序、ID 升序稳定排序。列表只返回明确列出的非凭据字段。设备计数包含已退出设备,存储对象为账号级对象记录数。

身份与安全边界

  • 普通用户 Bearer Token 无法访问管理 API;管理员 Cookie 无法访问用户同步 API。
  • 管理员配置与已有 /metrics 管理令牌独立。
  • 每个登录请求最多 4 KiB;每个连接来源每分钟最多 5 次尝试。
  • 管理写请求必须带匹配的 Origin,包括登录与退出。
  • 开发环境默认按请求 Host 和连接协议匹配 Origin;正式环境明确设置 MYNOTE_ADMIN_ORIGIN。
  • 反向代理保留 Host;未配置可信代理 IP 解析,因此代理后的登录限流按代理连接 IP 聚合。
  • 密码用 scrypt 哈希校验。会话随机生成,服务端只保存 token 摘要。
  • Cookie 为 HttpOnly、SameSite=Strict,路径为 /admin/v1,有效期 8 小时。
  • 原生 TLS 或配置 HTTPS origin 时设置 Secure。正式部署必须使用 HTTPS。
  • 会话与限流记录保存在进程内并有容量上限;重启后会话失效。当前用于单实例。
  • 当前管理业务只有查询;新增写操作时需要权限校验和审计记录。

验证

node scripts/run.mts node --test test/hosted-sync-admin.test.js test/hosted-sync-http.test.js

覆盖管理员登录、Cookie 属性、越权隔离、Origin 校验、登录请求大小、字段白名单、分页边界、退出撤销、限流和未配置凭据。既有 HTTP 测试验证 client API。

列表统计与关联筛选

  • 账号列表包含 libraryCount(现有仓库数)、deviceCount(未撤销设备数)和 usedBytes(账号存储对象的去重字节总量,与配额接口一致)。无关联记录时返回 0。
  • 笔记库列表包含 accountEmail、fileCount(未删除文件数)和 versionCount(历史版本数)。
  • 两个列表均支持可选的 accountId 参数,精确匹配账号 ID;筛选同时影响 items 和 total,再进行分页。未知账号返回空列表;空 ID 或超过 128 字符返回 400。
  • 管理前端点击账号的仓库数量跳到 /libraries?accountId=...,点击仓库所属账号跳到 /accounts?accountId=...。筛选和分页保存在 URL 中,支持刷新、浏览器前进后退和复制链接。
  • 仓库对象可能在账号内共享,因此不将账号使用空间分摊成仓库占用空间。

README

codemirror-migration

点赞(0) 阅读(16) 举报
目录
标题