No description
- Go 57.2%
- HTML 38.1%
- Dockerfile 2.7%
- Makefile 2%
| config | ||
| controller | ||
| db | ||
| deploy | ||
| logger | ||
| service | ||
| templates | ||
| .dockerignore | ||
| .gitignore | ||
| config.yaml | ||
| DEPLOY_NOTES.md | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| Makefile | ||
| PROJECT_ANALYSIS.md | ||
| README.md | ||
Layla-UIS(UnifiedAuth)
统一身份验证网关:TOTP 动态码登录 → 签发共享 Session Cookie(cloverdo.cn 根域)→ 供各子站 auth_request 统一鉴权。
- 技术栈:Go 1.25 + Gin + Redis + viper(环境变量注入凭据)
- 仓库:
git.cloverdo.cn/Cloverdo/Layla-UIS.git(dev / main 同步) - 镜像:
git.cloverdo.cn/cloverdo/layla-uis:20260808(Forgejo 容器仓库)
部署
bash /opt/agent/deploy-layla-uis.sh # 服务器 10.10.10.102 上的一键部署脚本
必要环境变量:AUTH_REDIS_ADDR、AUTH_REDIS_PASSWORD、AUTH_TOTP_SECRET(AUTH_COOKIE_SECURE、AUTH_TRUSTED_PROXIES 按部署环境调整)。详见 DEPLOY_NOTES.md。
建议修改项(评审留档 2026-08-09)
来源:外部大模型对当前代码的评审,已逐条核对源码,6 条全部属实。 结论:个人自用场景下暂无恶性 bug,本轮暂不修改,留档供下次调整时参考。
1. 端口暴露范围 -p 6789:6789(优先修)
- 问题:Docker 示例(Makefile、DEPLOY_NOTES)把 6789 直接发布到所有网卡,等于多开一个公网攻击面。本服务设计上应由同机 Nginx 调
/_oauth_check,无需对外。 - 建议:Nginx 反代就绪后改为
-p 127.0.0.1:6789:6789,仅本机可访问。 - 注意:改之前用户是 IP 直连
http://10.10.10.102:6789/访问的,改成回环地址后必须走auth.cloverdo.cn反代。
2. 配置缺少启动时校验(优先修)
- 问题:
config.InitConfig()只做 Unmarshal,不校验totp_secret是否为空、TTL 是否 > 0、max_failures是否合理。配置错误时服务照常启动,表现是"怎么都登录不了"(与本项目曾踩过的 viper 环境变量绑定坑同款症状)。 - 建议:启动时校验关键配置,缺失/非法直接
logger.Log.Fatal。 - 价值:换机器/换域名复用镜像时,配置错了启动即报错,不用瞎猜。
3. rd 参数未 URL 编码(实际功能 bug)
- 问题:Nginx 示例
?rd=$scheme://$http_host$request_uri未编码,原 URL 含多个&时(如 OAuth callback、复杂查询参数)跳转会丢参数。DEPLOY_NOTES.md已自认此问题。 - 建议:长期改为服务端 state 或前端
encodeURIComponent后再传。 - 影响:普通访问
/、code-server 首页基本无感,个人自用场景碰到的概率低。
4. trusted_proxies 未配好时全站共享限流计数(部署坑)
- 问题:默认只信任
127.0.0.1/::1,Docker 模式下来源是网关 IP,所有用户会被识别成同一 IP,限流变成"全站共享一个失败计数器"。 - 状态:✅ 已解决。当前部署已注入
AUTH_TRUSTED_PROXIES="127.0.0.1,::1,172.17.0.1"(含 Docker 网关)。 - 提醒:换环境部署时记得核对日志中记录的 ClientIP,把实际网关加进 trusted_proxies。
5. TOTP 验证码可在有效窗口内重复使用(低优先级)
- 问题:
totp.Validate默认允许 Skew 1(±30s),项目未记录"已使用过的 counter",同一验证码在有效期内可重复创建多个 Session。 - 建议:如要补,用 Redis
SETNX记录已使用的 TOTP counter 即可。 - 评估:个人自用 + 全程 HTTPS + 验证码只在本人 Authenticator 里,风险低,不建议为此增加复杂度。
6. X-Auth-Token 兼容模式优先级问题(小逻辑 bug)
- 问题:
CheckToken()只在 Cookie 缺失/为空时才读X-Auth-Token。若浏览器带过期 Cookie 同时 Header 有有效 Token,有效 Header 会被忽略,直接 401。 - 建议:改为"先验证 Cookie,无效再尝试 Header"。当前主要靠 Nginx
auth_request走 Cookie,基本用不到 Header,触发条件苛刻。
变更记录
- 2026-08-09:dev 与 main 同步至
df466bf(勾选框对齐/焦点保持、成功页文案与居中、页脚版本号);构建镜像20260808并推送 Forgejo 容器仓库;新增本文档存档评审建议。