为博客增加一个密码输入框并不难。真正困难的是密码存储、会话续期、暴力破解、找回流程、审计和依赖升级。
对个人技术博客,更稳妥的方案是复用成熟身份系统。
把职责拆开
- GitHub 保存 Markdown 内容并记录每次修改;
- OAuth 负责确认管理员身份,不向博客暴露 GitHub 密码;
- 回调函数 检查 GitHub 用户名和私有仓库写权限,拒绝其他账号;
- Cloudflare Pages 在内容提交后重新构建公开网站。
后台不直接连接数据库,也不保存用户密码。即使公开网站出现前端漏洞,攻击者也无法得到一个可复用的管理员密码。
最小权限
内容仓库应独立于其他代码。需要注意,经典 GitHub OAuth 为了写入私有仓库必须申请 repo 权限,这个权限会覆盖账号可访问的全部私有仓库,无法只限定到博客仓库。更稳妥的做法是使用只管理博客的独立 GitHub 账号,并在服务端同时校验固定登录名和目标仓库的写权限。被拒绝账号的新令牌应立即撤销。
仍然需要维护的部分
无密码不等于无风险。管理员仍应开启 GitHub 两步验证,定期检查已授权应用,并对依赖更新和异常提交保持关注。