生产客户端只引用 postsV2、getMyRoleV2 和 dataRetentionV2。旧函数不得重新开放
客户端权限。
cloudfunctions/postsV2
cloudfunctions/getMyRoleV2
cloudfunctions/dataRetentionV2
三个目录使用公共 npm registry 生成的锁文件,生产依赖审计应保持 0 个 High/Critical。
postsV2 vendored 的 lodash.set / lodash.unset 修复和 axios override 不得在更新依赖时
无意移除。
| 函数 | handler | runtime | timeout | trigger |
|---|---|---|---|---|
postsV2 |
index.main |
Nodejs20.19 |
60s | 无 |
getMyRoleV2 |
index.main |
Nodejs20.19 |
5s | 无 |
dataRetentionV2 |
index.main |
Nodejs20.19 |
120s | dailyRetentionSweepV2 |
触发器使用 7 段 cron 0 17 3 * * * *,即北京时间每天 03:17。
平台当前最高运行时是 Nodejs20.19,但 Node 20 已超过上游维护期。每次发布前检查
CloudBase 是否已提供更高运行时;一旦可用,先在测试环境验证 SDK 与内容安全接口后迁移。
生产环境应回读到等价配置:
{
"*": {
"invoke": "auth.loginType != 'ANONYMOUS' && auth != null"
},
"posts": { "invoke": false },
"getMyRole": { "invoke": false },
"dataRetention": { "invoke": false },
"dataRetentionV2": { "invoke": false }
}该规则只控制客户端调用;管理 API 和定时触发器不受它限制。postsV2 内部仍必须:
- 从
cloud.getWXContext()获取可信 OPENID。 - 对公开分享
get/listComments使用 OPENID 哈希限流,但不建立账户、不返回本人状态。 - 对普通读取和写操作校验当前协议同意、账户状态与频率。
- 对管理动作重新查询
admins。
好友分享中,已完成当前同意的用户走身份化读取;未同意或同步失败才回退公开 DTO。 朋友圈 scene 1154 始终走公开只读。
- 运行本地检查与三份生产依赖审计。
- 创建/回读 10 个集合、V2 索引和全拒绝数据库规则。
- 迁移任务 GeoPoint、关闭时间、marker counter、历史随机图片路径和临时头像字段。
- 部署三个 V2 函数并回读 runtime、timeout、状态与触发器。
- 更新客户端函数名并重新上传代码包。
- 最后写入函数安全规则,确认旧函数和 retention 函数客户端不可调。
若任一步失败,不应开放旧 posts 作为兼容路径;它缺少 V2 同意、限流、地理范围、作者
可信来源和数据最小化门禁。
npm run check
node --check cloudfunctions/postsV2/index.js
node --check cloudfunctions/postsV2/lib.js
node --check cloudfunctions/getMyRoleV2/index.js
node --check cloudfunctions/dataRetentionV2/index.js
npm audit --omit=dev --prefix cloudfunctions/postsV2
npm audit --omit=dev --prefix cloudfunctions/getMyRoleV2
npm audit --omit=dev --prefix cloudfunctions/dataRetentionV2
git diff --check- 管理 API 无微信上下文调用普通
list应返回UNAUTHENTICATED。 - 真实好友分享、未同意用户只能读取指定
id和公开评论,不能列出附近 feed 或写数据。 - 已同意发布者从好友分享打开自己任务,
isMine=true且能看到关闭按钮。 - 朋友圈 scene 1154 保持只读;写操作仍拒绝。
- 连续公共读取超过限额时应返回
RATE_LIMITED。
- 正常标题、正文、地点、昵称、评论、反馈通过;风险内容和 87014 被拒绝。
- OpenAPI 权限不可用或返回异常时必须 fail closed。
- 正常 JPG/PNG 可发布;伪后缀、损坏文件、超过 1MB 或 750×1334 被拒绝。
- 客户端直接写云存储失败;服务端上传成功后只返回随机
cloud://fileID。
- 同一 request ID 的发布、评论、反馈重试只产生一条记录。
- 同 request ID 携带不同 payload 返回
IDEMPOTENCY_CONFLICT。 - 同一用户重复信任动作只计一次;并发举报达到阈值时隐藏状态不丢失。
hidden不得被并发resolve覆盖。- 两个账号验证管理员/普通用户边界和评论举报队列。
手动调用最终版 dataRetentionV2,至少确认:
- 无符合条件数据时返回完整零计数摘要且不修改现有任务。
- 任务只有在子评论、反应、图片和绑定会话处理成功后才标记 retired。
- 旧头像会话标记
superseded;仍被账户、未归档任务或评论引用时不删除;无引用后删除。 - 删除失败留下重试状态并使本轮返回失败,不能静默成功。
- 过期限流桶和 90 天前终态上传会话元数据会物理删除并回读无残留。
DevTools、iOS、Android、双账号、弱网、真实好友/朋友圈分享、公众平台隐私保护指引和 内容安全权限必须由真实 AppID/真实登录态执行。未执行时写“未验证”,不能写“通过”。