1
1
mirror of https://github.com/ZeroCatDev/ClassworksKV.git synced 2025-12-07 04:43:09 +00:00
ClassworksKV/API_AUTOAUTH.md
SunWuyuan bb61e6e6f5
feat: Add AutoAuth functionality and enhance Apps API
- Introduced AutoAuth model to manage automatic authorization configurations for devices.
- Added new endpoint to obtain token via namespace and password for automatic authorization.
- Implemented functionality to set student names for student-type tokens.
- Enhanced AppInstall model to include deviceType and isReadOnly fields.
- Updated device creation to allow custom namespaces and ensure uniqueness.
- Added routes for managing AutoAuth configurations, including CRUD operations.
- Implemented checks for read-only tokens in KV operations.
- Created detailed API documentation for AutoAuth and new Apps API endpoints.
- Added migration scripts to accommodate new database schema changes.
2025-11-01 19:31:46 +08:00

6.6 KiB
Raw Permalink Blame History

AutoAuth 和新增 Apps API 文档

概述

本文档描述了自动授权 (AutoAuth) 相关的 API 接口以及新增的应用管理接口。


Apps API 新增接口

1. 通过 namespace 和密码获取 token

端点: POST /apps/auth/token

描述: 通过设备的 namespace 和密码进行自动授权,创建新的 AppInstall 并返回 token。

请求体:

{
  "namespace": "string (必填)",
  "password": "string (可选,根据自动授权配置)",
  "appId": "string (必填)"
}

成功响应 (201 Created):

{
  "success": true,
  "token": "string",
  "deviceType": "string | null",
  "isReadOnly": boolean,
  "installedAt": "datetime"
}

错误响应:

  • 400 Bad Request: 缺少必填字段
  • 404 Not Found: 设备不存在或 namespace 不正确
  • 401 Unauthorized: 密码不正确或需要提供密码

说明:

  • 该接口会查找匹配的 AutoAuth 配置
  • 如果提供了密码,会验证密码是否匹配任何自动授权配置
  • 如果没有提供密码,会查找无密码的自动授权配置
  • 根据匹配的 AutoAuth 配置设置 deviceTypeisReadOnly 属性

2. 设置学生名称

端点: POST /apps/tokens/:token/set-student-name

描述: 为学生类型的 token 设置名称(更新 note 字段)。

URL 参数:

  • token: AppInstall 的 token

请求体:

{
  "name": "string (必填)"
}

成功响应 (200 OK):

{
  "success": true,
  "token": "string",
  "name": "string",
  "updatedAt": "datetime"
}

错误响应:

  • 400 Bad Request: 缺少名称或名称不在学生列表中
  • 403 Forbidden: token 类型不是 student
  • 404 Not Found: token 不存在或设备未设置学生列表

说明:

  • 只有 deviceTypestudent 的 token 才能使用此接口
  • 会验证提供的名称是否存在于设备的 classworks-list-main 键值中
  • 学生列表格式: [{"id": 1, "name": "学生1"}, {"id": 2, "name": "学生2"}]

AutoAuth 管理 API

🔐 所有 AutoAuth 管理接口都需要 JWT Account Token 认证

重要: 只有已绑定账户的设备才能使用这些接口。未绑定账户的设备无法管理 AutoAuth 配置。

通过 HTTP Headers 提供:

  • Authorization: Bearer {jwt_token} - 账户的 JWT Token

1. 获取设备的自动授权配置列表

端点: GET /auto-auth/devices/:uuid/auth-configs

认证: 需要 JWT Token (账户必须是设备的拥有者)

URL 参数:

  • uuid: 设备的 UUID

成功响应 (200 OK):

{
  "success": true,
  "configs": [
    {
      "id": "string",
      "hasPassword": boolean,
      "deviceType": "string | null",
      "isReadOnly": boolean,
      "createdAt": "datetime",
      "updatedAt": "datetime"
    }
  ]
}

说明:

  • 返回的配置不包含实际的密码哈希值,只显示是否有密码

2. 创建自动授权配置

端点: POST /auto-auth/devices/:uuid/auth-configs

认证: 需要 JWT Token (账户必须是设备的拥有者)

URL 参数:

  • uuid: 设备的 UUID

请求体:

{
  "password": "string (可选)",
  "deviceType": "string (可选: teacher|student|classroom|parent)",
  "isReadOnly": boolean (可选,默认 false)
}

成功响应 (201 Created):

{
  "success": true,
  "config": {
    "id": "string",
    "hasPassword": boolean,
    "deviceType": "string | null",
    "isReadOnly": boolean,
    "createdAt": "datetime"
  }
}

错误响应:

  • 400 Bad Request: 设备类型无效或密码配置已存在

说明:

  • 同一设备的密码必须唯一(包括空密码)
  • deviceType 必须是 teacherstudentclassroomparent 之一,或为空

3. 更新自动授权配置

端点: PUT /auto-auth/devices/:uuid/auth-configs/:configId

认证: 需要 JWT Token (账户必须是设备的拥有者)

URL 参数:

  • uuid: 设备的 UUID
  • configId: 自动授权配置的 ID

请求体:

{
  "password": "string (可选)",
  "deviceType": "string (可选: teacher|student|classroom|parent)",
  "isReadOnly": boolean (可选)
}

成功响应 (200 OK):

{
  "success": true,
  "config": {
    "id": "string",
    "hasPassword": boolean,
    "deviceType": "string | null",
    "isReadOnly": boolean,
    "updatedAt": "datetime"
  }
}

错误响应:

  • 400 Bad Request: 设备类型无效或新密码与其他配置冲突
  • 403 Forbidden: 无权操作此配置
  • 404 Not Found: 配置不存在

说明:

  • 只能更新属于当前设备的配置
  • 更新密码时会检查是否与该设备的其他配置冲突

4. 删除自动授权配置

端点: DELETE /auto-auth/devices/:uuid/auth-configs/:configId

认证: 需要 JWT Token (账户必须是设备的拥有者)

URL 参数:

  • uuid: 设备的 UUID
  • configId: 自动授权配置的 ID

成功响应 (204 No Content):

  • 无响应体

错误响应:

  • 403 Forbidden: 无权操作此配置
  • 404 Not Found: 配置不存在

说明:

  • 只能删除属于当前设备的配置

设备类型 (deviceType)

可选的设备类型值:

  • teacher: 教师
  • student: 学生
  • classroom: 班级一体机
  • parent: 家长
  • null: 未指定类型

使用流程示例

场景 1: 学生使用 namespace 登录

  1. 学生输入班级的 namespace 和密码
  2. 调用 POST /apps/auth/token 获取 token
  3. 使用返回的 token 访问 KV 存储
  4. 如果是学生类型,调用 POST /apps/tokens/:token/set-student-name 设置自己的名称

场景 2: 管理员配置自动授权

  1. 管理员通过账户登录获取 JWT Token
  2. 调用 POST /auto-auth/devices/:uuid/auth-configs 创建多个授权配置:
    • 教师密码deviceType: teacher, isReadOnly: false
    • 学生密码deviceType: student, isReadOnly: false
    • 家长密码deviceType: parent, isReadOnly: true
  3. 学生/教师/家长使用对应密码通过 namespace 登录

注意: 设备必须已绑定到管理员的账户才能配置 AutoAuth


注意事项

  1. 密码安全: 所有密码都使用 bcrypt 进行哈希存储
  2. 唯一性约束:
    • 同一设备的 namespace 必须唯一
    • 同一设备的 AutoAuth 密码必须唯一(包括 null
  3. 级联删除: 删除设备会级联删除所有相关的 AutoAuth 配置和 AppInstall 记录
  4. 只读限制: isReadOnly 为 true 的 token 在 KV 操作中会受到写入限制
  5. 账户绑定要求: 只有已绑定账户的设备才能管理 AutoAuth 配置,未绑定账户的设备无法使用 AutoAuth 管理接口