beervid-app-cli 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,132 @@
1
+ # 安全最佳实践
2
+
3
+ 本文档只保留与 BEERVID Open API 接入直接相关的安全要求,避免掺入与当前 API 无关的通用后端模板内容。
4
+
5
+ ## 目录
6
+
7
+ 1. [API Key 使用](#api-key-使用)
8
+ 2. [OAuth 回调处理](#oauth-回调处理)
9
+ 3. [请求与日志](#请求与日志)
10
+ 4. [账号与 Token 存储](#账号与-token-存储)
11
+ 5. [上线前检查](#上线前检查)
12
+
13
+ ---
14
+
15
+ ## API Key 使用
16
+
17
+ ### 1. 不要硬编码 `BEERVID_APP_KEY`
18
+
19
+ ```typescript
20
+ const apiKey = process.env.BEERVID_APP_KEY
21
+ if (!apiKey) {
22
+ throw new Error('BEERVID_APP_KEY is required')
23
+ }
24
+ ```
25
+
26
+ ### 2. 只在服务端保存和使用 API Key
27
+
28
+ - 不要把 `BEERVID_APP_KEY` 下发到浏览器或移动端
29
+ - 前端如果需要调用能力,应先请求你自己的后端,再由后端调用 Open API
30
+ - CLI 场景下优先使用 `beervid config --app-key` 或环境变量,不要把 Key 写进代码仓库
31
+
32
+ ### 3. 区分不同环境的 Key
33
+
34
+ - 测试、预发、生产环境分别使用独立 Key
35
+ - 怀疑泄露时立即轮换 Key
36
+ - 不要在日志、截图、报错信息里输出完整 Key
37
+
38
+ ---
39
+
40
+ ## OAuth 回调处理
41
+
42
+ ### 1. 校验并持久化 `state`
43
+
44
+ BEERVID 的 TT / TTS OAuth 流程依赖回调 URL 中的 `state` 参数;你至少应做到:
45
+
46
+ - 生成授权链接时为当前用户生成一次性 `state`
47
+ - 回调时校验 `state` 是否存在、是否过期、是否已使用
48
+ - 从 `state` 中提取 `ttAbId` / `ttsAbId` 后再落库
49
+
50
+ 推荐直接参考 [oauth-callback.md](./oauth-callback.md) 中的完整落地方式。
51
+
52
+ ### 2. 回调地址使用 HTTPS
53
+
54
+ - 生产环境回调 URL 使用 HTTPS
55
+ - 只在你自己控制的域名下接收回调
56
+ - 不要把完整回调 URL 原样打进日志,避免把 `state` 暴露出去
57
+
58
+ ---
59
+
60
+ ## 请求与日志
61
+
62
+ ### 1. 统一通过服务端封装请求
63
+
64
+ 建议统一封装 `openApiGet`、`openApiPost`、`openApiUpload` 这类函数,集中处理:
65
+
66
+ - `X-API-KEY` 注入
67
+ - 基础地址拼接
68
+ - 超时控制
69
+ - 响应解包
70
+ - 错误格式化
71
+
72
+ ### 2. 日志里只打印脱敏后的关键信息
73
+
74
+ 推荐记录:
75
+
76
+ - 接口路径
77
+ - 业务账号 ID(`businessId` / `creatorUserOpenId`)
78
+ - `shareId` / `videoId`
79
+ - Open API `code`、`message`
80
+
81
+ 不要记录:
82
+
83
+ - 完整 API Key
84
+ - 完整 access token
85
+ - 完整 OAuth `state`
86
+ - 含敏感 query 参数的原始 URL
87
+
88
+ ### 3. 对外错误信息保持收敛
89
+
90
+ - 对用户返回“授权失效”“参数错误”“上传失败”这类业务级信息
91
+ - 详细堆栈和 Open API 原始报错只保留在服务端日志中
92
+
93
+ ---
94
+
95
+ ## 账号与 Token 存储
96
+
97
+ ### 1. 只存必须的账号字段
98
+
99
+ 对当前项目来说,真正高频使用的字段通常是:
100
+
101
+ - `accountType`
102
+ - `accountId`
103
+ - `businessId`
104
+ - `creatorUserOpenId`
105
+ - `username`
106
+ - `displayName`
107
+ - `sellerName`
108
+ - `profileUrl`
109
+ - `followersCount`
110
+
111
+ ### 2. `accessToken` 按需存储
112
+
113
+ `account/info` 会返回 `accessToken`。如果你的业务不会直接使用它:
114
+
115
+ - 可以不入库
116
+ - 或仅短期缓存,不作为常规展示字段返回给前端
117
+
118
+ 如果必须持久化,至少做到:
119
+
120
+ - 数据库字段与普通展示字段分开
121
+ - 日志脱敏
122
+ - 读取权限最小化
123
+
124
+ ---
125
+
126
+ ## 上线前检查
127
+
128
+ - `BEERVID_APP_KEY` 仅存在于服务端环境变量或本地 CLI 配置中
129
+ - OAuth 回调已校验 `state`,且 `ttAbId` / `ttsAbId` 已正确落库
130
+ - 对外接口不会返回 API Key、access token、原始 `state`
131
+ - Open API 请求封装已统一超时和错误处理
132
+ - 业务日志里只保留脱敏后的账号 ID、`shareId`、`videoId`