feat: 初始化微信小程序后端骨架
- NestJS + TypeScript + Prisma + PostgreSQL 工程骨架 - 微信登录安全流程:服务端 code2Session 换 openid 后签发 JWT, session_key 缓存于 Redis,不信任前端 openid - 统一响应/异常处理、JWT 全局鉴权(@Public 豁免)、Swagger 文档 - Prisma 全量核心 schema(用户/分类/商品/设计清单/地址/订单/支付/上传/定制任务)+ seed - 业务模块空壳(商品/分类/设计清单/地址/订单/支付/上传/BullMQ 队列) - Docker 多阶段镜像 + 本地/生产 docker-compose - docs:密钥获取指南、COS SDK 移除记录 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# COS SDK 移除记录
|
||||
|
||||
**日期**:2026-08-05
|
||||
|
||||
## 背景
|
||||
|
||||
初次搭建骨架时,在 `package.json` 的 `dependencies` 中加入了 `cos-nodejs-sdk-v5`(^2.14.0),
|
||||
计划用于后续的腾讯云对象存储(COS)直传功能。
|
||||
|
||||
## 移除原因
|
||||
|
||||
`npm audit` 检出 12 个安全漏洞(3 critical / 2 high / 7 moderate),**全部来自**
|
||||
`cos-nodejs-sdk-v5` 及其传递依赖:
|
||||
|
||||
- `fast-xml-parser`(critical)— 多个实体展开绕过 / DoS 漏洞
|
||||
- `form-data`(critical)— 不安全随机边界、CRLF 注入
|
||||
- `request`(已废弃)— 含已知漏洞的旧库
|
||||
- `ajv` / `conf`(moderate)
|
||||
|
||||
COS 功能本轮仅为**占位**(`src/upload/` 仅提供服务方法签名,代码中**并未真正 import**
|
||||
该 SDK),因此移除后不影响现有代码与功能。
|
||||
|
||||
## 变更内容
|
||||
|
||||
- 从 `package.json` `dependencies` 移除 `cos-nodejs-sdk-v5@^2.14.0`
|
||||
- 执行 `npm uninstall cos-nodejs-sdk-v5` 清理 `node_modules` 与 `package-lock.json`
|
||||
- 审计结果:critical/moderate 漏洞清零,仅剩 2 个 high(来自 `js-yaml`,
|
||||
属 `ts-node-dev` 的**开发期**传递依赖,不进入生产镜像)
|
||||
|
||||
## 当前状态
|
||||
|
||||
`npm audit fix --force` 可自动升级到 `cos-nodejs-sdk-v5@3.0.0`(破坏性大版本),
|
||||
但本轮不需要 COS,故**不升级、保持移除**。
|
||||
|
||||
## 后续恢复 COS 时的注意事项
|
||||
|
||||
实现 COS 直传 / 预签名时,重新引入 SDK 请:
|
||||
|
||||
1. 使用 **v3.x**(`cos-nodejs-sdk-v5@^3.0.0`),避免 2.x 的旧依赖链漏洞;
|
||||
2. 引入后立即执行 `npm audit` 复核漏洞情况;
|
||||
3. 若仍报 critical(e.g. `fast-xml-parser` 传递依赖),考虑用「先直传后回调」的
|
||||
最小化接入,或改用官方推荐的 **COS STS / 临时密钥** 方案,减少客户端 SDK 依赖。
|
||||
@@ -0,0 +1,97 @@
|
||||
# 密钥与配置获取指南
|
||||
|
||||
本项目的敏感配置全部通过环境变量(`.env`)注入,绝不允许提交进仓库。
|
||||
以下说明各项值的**来源**与**获取方式**。
|
||||
|
||||
> ⚠️ 安全提醒:任何密钥都不要写入代码、提交到 git,或发给第三方。
|
||||
> 妥善保管,生产环境与本地环境分离。
|
||||
|
||||
---
|
||||
|
||||
## 1. JWT_SECRET(JWT 签名密钥)
|
||||
|
||||
- **是什么**:用于签名/校验登录 access token 的对称密钥(≥16 位,建议 64 位十六进制)。
|
||||
- **哪里来**:本地自行生成,无第三方。用系统安全随机数生成:
|
||||
|
||||
```bash
|
||||
# 方式一:openssl
|
||||
openssl rand -hex 64
|
||||
|
||||
# 方式二:node
|
||||
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
|
||||
```
|
||||
|
||||
- **要求**:每次输出粘贴到 `.env` 的 `JWT_SECRET=` 即可。**生产必须换成新的高熵随机串**,
|
||||
与本地/测试完全区分;切勿使用示例值。
|
||||
- **注意**:更换后所有已签发的 token 会立即失效(用户需重新登录),属预期行为。
|
||||
|
||||
---
|
||||
|
||||
## 2. WX_APPID / WX_SECRET(微信小程序凭证)
|
||||
|
||||
- **是什么**:小程序唯一标识(AppID)与对应的 AppSecret。
|
||||
- **哪里来**:**微信公众平台**(https://mp.weixin.qq.com)。
|
||||
1. 登录后,进入「小程序」→ 左侧「开发」→「开发管理」→「开发设置」。
|
||||
2. 页面顶部「AppID(小程序ID)」即 `WX_APPID`。
|
||||
3. 「AppSecret(小程序密钥)」需点击「生成/重置」获取,生成后仅显示一次,请立即保存。
|
||||
- **安全要点**:AppSecret 仅存于**服务端**,绝不写入小程序代码或随请求下发。
|
||||
本项目 `code2Session` 使用服务端持有的 appid+secret 调微信换取 openid。
|
||||
|
||||
---
|
||||
|
||||
## 3. 微信支付相关(WX_MCH_*,预留,当前为空)
|
||||
|
||||
> 骨架阶段支付功能为占位,**暂无必填**。上线支付时按以下获取:
|
||||
|
||||
- **WX_MCH_ID**(商户号):微信支付商户平台申请开通后获得。
|
||||
- **WX_MCH_API_V3_KEY**(APIv3 密钥):商户平台 →「账户中心」→「API安全」→「APIv3密钥」设置。
|
||||
- **WX_MCH_SERIAL_NO**(商户证书序列号):商户平台「API安全」→「申请API证书」后,在
|
||||
证书详情中查看序列号。
|
||||
- **WX_MCH_PRIVATE_KEY_PATH**(商户私钥):申请 API 证书时下载的私钥文件,存放于
|
||||
服务端的 `key/` 目录(已被 gitignore 忽略)。
|
||||
- **WX_PAY_NOTIFY_URL**(支付回调地址):需为公网可访问的 HTTPS 地址,如
|
||||
`https://your-domain/api/payments/notify`。
|
||||
|
||||
前置条件:小程序需完成微信支付商户号绑定与经营资质审核。
|
||||
|
||||
---
|
||||
|
||||
## 4. COS(腾讯云对象存储,COS_*,当前为空)
|
||||
|
||||
> 骨架阶段 COS 为占位(SDK 已移除,见 `docs/cos-sdk-removal.md`)。接入时获取:
|
||||
|
||||
- **COS_BUCKET** / **COS_REGION**:
|
||||
1. 腾讯云控制台 →「对象存储 COS」→「存储桶列表」。
|
||||
2. 创建/选择存储桶,桶名称即 `COS_BUCKET`(形如 `wxmp-125xxxxxxx`)。
|
||||
3. 桶所在地域即 `COS_REGION`(形如 `ap-guangzhou`)。
|
||||
- **COS_SECRET_ID** / **COS_SECRET_KEY**:
|
||||
1. 腾讯云控制台 →「访问管理 CAM」→「访问密钥」→「API 密钥管理」。
|
||||
2. 新建/查看密钥,SecretId 与 SecretKey 填入对应变量。
|
||||
- 生产建议用**子账号 / 临时密钥(STS)**,权限最小化,主账号密钥仅本地调试用。
|
||||
|
||||
---
|
||||
|
||||
## 5. 数据库与 Redis(DATABASE_URL / REDIS_URL)
|
||||
|
||||
- **DATABASE_URL**:PostgreSQL 连接串,格式
|
||||
`postgresql://<user>:<password>@<host>:<port>/<db>?schema=public`。
|
||||
- 本地开发(docker compose)默认:
|
||||
`postgresql://postgres:postgres@localhost:5432/wxmp?schema=public`
|
||||
- 生产改为真实主机/账号/密码,并避免在 URL 中明文存弱口令。
|
||||
- **REDIS_URL**:Redis 连接串,格式 `redis://[:password]@<host>:<port>`。
|
||||
生产若开启认证/加密,按需补充。
|
||||
|
||||
---
|
||||
|
||||
## 快速核对清单
|
||||
|
||||
| 变量 | 必须 | 来源 |
|
||||
|---|---|---|
|
||||
| `JWT_SECRET` | ✅ 生产必须换 | 本地 `openssl rand -hex 64` |
|
||||
| `WX_APPID` / `WX_SECRET` | ✅ | 微信公众平台·开发设置 |
|
||||
| `DATABASE_URL` | ✅ | 自建 PostgreSQL |
|
||||
| `REDIS_URL` | ✅ | 自建 Redis |
|
||||
| `WX_MCH_*` | 支付时 | 微信支付商户平台 |
|
||||
| `COS_*` | COS 接入时 | 腾讯云控制台(COS/CAM) |
|
||||
|
||||
部署前请在服务器上用工具生成独立的随机密钥,**不要把本地 `.env` 原样搬上生产**。
|
||||
Reference in New Issue
Block a user