如何看懂 OpenShorts 的安全与隐私设计GDPR 账号删除、API 密钥管理与媒体 URL 签名详解【免费下载链接】openshortsOpen source AI clip generator: turns long videos into viral 9:16 shorts with AI moment detection, face tracking, subtitles and dubbing. Self-host free with Docker (MIT), or use the cloud with GPU speed from $12/mo. MCP server and API for AI agents.项目地址: https://gitcode.com/gh_mirrors/op/openshortsOpenShorts 是一款开源 AI 剪辑平台能把长视频自动切成带人脸追踪、字幕和配音的 9:16 短视频。处理视频离不开用户数据账号信息、API 密钥、视频文件都托管在服务器上它的安全与隐私设计GDPR 账号删除、API 密钥管理、媒体 URL 签名就值得我们逐层拆解。本文用通俗的方式带你走读这套设计的关键源码。先看懂全景数据都在哪里OpenShorts 有两种运行方式自托管本仓库云端托管你的数据在你自己的服务器上在它的服务器上API 密钥自带Gemini、ElevenLabs 等内置一键创建MCP / API同一套/mcp端点常驻端点不管哪种方式安全设计的核心都是同一套代码下面三块是重点GDPR 账号删除cloud/account.py 实现被遗忘权API 密钥管理cloud/api_keys.py 管理osk_前缀的程序化访问密钥媒体 URL 签名media_auth.py 保护/videos和/thumbnails下的字节流GDPR 账号删除一键、即时、不可逆GDPR 第 17 条要求删除不得有不当延迟而一旦账号没了就不存在找回这回事——所以 OpenShorts 的删除是即时且不可逆的只有一个端点DELETE /api/account。删除的前置条件必须手动输入账号邮箱作为确认步骤没有密码可重新输入输入邮箱是最强的确认手段API 密钥不能删账号泄露的密钥绝不应有能力销毁它所属的账号这个限制和密钥管理是同一套思路见 cloud/api_keys.py有视频还在处理中时拒绝删除避免在任务写文件时把输出抽走删除顺序为什么这么排cloud/account.py 顶部注释写了两条铁律每条都来自某一步失败会怎样的反推先取消 Stripe 订阅失败就整体中止——如果先删用户行一个仍在扣费的订阅就成了没人能认领的账单事故先清 R2 云存储再删数据库——数据库行是哪些文件属于这个用户的唯一索引先删索引而存储删除失败就会留下永远找不回来的孤儿文件哪些数据被保留为什么删除是彻底删除用户的所有表cloud/account.py 中的USER_OWNED_TABLES含订阅、用量账本、API 密钥、项目等但有两样故意存活Stripe 客户与发票西班牙商法要求 6 年留存一条删除记录只存邮箱的 SHA-256 哈希email_fingerprint不含明文地址用于在 5 年内自证删除确实发生过注销原因也是固定选项列表而非自由文本——因为这条记录会比账号活得更久用户随手敲的我的名字是X请确认就会变成留存的个人数据。完整的数据留存时间表精确到哪个代码常量执行了哪个期限见官方文档 docs/compliance/retencion.md配套测试在 tests/test_account_erasure.py。API 密钥管理只存哈希密钥管不了密钥OpenShorts 给 MCP 客户端、脚本和 CI 提供osk_前缀的 API 密钥前端管理界面在 dashboard/src/components/ApiKeysCard.jsx。它的设计有几个值得注意的点核心安全决策数据库只存 SHA-256 哈希hash_key明文密钥只在创建时出现一次之后无法再取回管理端点只认会话 JWT拒绝 API 密钥认证——泄露的密钥不能用来给自己发替补这是密钥体系里最容易漏的一环每个账号最多 10 个活跃密钥超限需先吊销一个last_used_at每 5 分钟才刷新一次状态轮询不会把每次请求都变成一次数据库写入密钥认证走 cloud/auth.py 的user_id_for_key解析器解析通过后配额、权限、任务归属逻辑与会话用户完全一致。相关端点包括创建POST /api/keys、列表GET /api/keys和吊销DELETE /api/keys/{key_id}测试覆盖见 tests/test_api_keys.py。媒体 URL 签名视频链接背后的两种令牌media_auth.py的模块注释交代了动机/videos和/thumbnails曾经是静态目录挂载等于整个工作目录对互联网敞开只靠 UUID 当锁——它不仅会放出剪辑还会放出带客户 webhook 密钥的.resume.json、用户 UUID 的.owner旁车文件、人脸裁剪图等等。现在这两类前缀都走真实处理器用HMAC 签名决定谁可以下载而且针对不同消费者设计了两种令牌形态令牌形式给谁用路径能力令牌?exp…sig…无法携带请求头的消费方webhook 负载、MCP 工具返回的绝对 URL用户令牌?mtuid.exp.sig仪表盘页面video src不能带 Authorization 头几个细节体现防御纵深用户令牌有效期 12 小时刻意远短于 30 天的会话 JWT——因为它会出现在 URL 里就会进入访问日志和 Referer必须死得快签发点在 dashboard/src/lib/api.js白名单而非黑名单只有SERVABLE_EXTENSIONSmp4、mp3、jpg、srt 等可被服务工作目录里的转录稿、元数据 JSON 天然不可达路径规范化拒绝一切点开头的分段.resume.json、.owner、.instance无论谁来问都摸不到签名验证用hmac.compare_digest做恒定时间比较防时序侧信道另外还有 security_utils.py 提供的 SSRF 防护服务端会抓取用户提交的 URLyt-dlp 下载、页面爬取assert_public_url会解析域名下每一条A/AAAA 记录只要指向内网、回环或169.254.169.254云元数据端点就拒绝——防止有人借下载任务读取实例凭证。相关测试tests/test_ssrf_guard.py、tests/test_media_path_guard.py。结语安全设计如何落地OpenShorts 的安全与隐私设计有三个可借鉴的共性每一步都问失败一半会怎样删除顺序、Stripe 优先、R2 优先都是把最坏情况排到最前面令牌按消费方分形能带头的用头不能带头的才用 URL 签名且短命留存期必须写进代码常量文档里明确没有写在代码里的期限只是意图自托管时密钥与数据都在你自己的服务器上参考 docker-compose.yml使用云端时上述删除、密钥与签名机制同样生效。想深入了解某一块直接打开对应源码即可——注释本身就是最好的文档。【免费下载链接】openshortsOpen source AI clip generator: turns long videos into viral 9:16 shorts with AI moment detection, face tracking, subtitles and dubbing. Self-host free with Docker (MIT), or use the cloud with GPU speed from $12/mo. MCP server and API for AI agents.项目地址: https://gitcode.com/gh_mirrors/op/openshorts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考