Files
csctalon/.env.example
tanzk bb89347907
Some checks failed
gitleaks / gitleaks (push) Successful in 8s
backend-test / backend-lint-test (push) Failing after 31m59s
backend-test / frontend-lint-test (push) Successful in 50s
feat(sso): 跨子域 SSO 反向链路(netmgr 面板 → csctalon)
方向:本系统为消费方,netmgr 面板(panel.kimirock.top)为身份源。
面板管理员已登录后,点导航「数据分析系统」入口 → 面板签 60 秒 HMAC
一次性票据 → 302 到 /api/v1/auth/sso → 本系统验票 → 复用自身登录链路
签 JWT → 引导页写 localStorage 跳转,实现无感免密登录。

- 新增 services/netmgr_sso.py:HMAC-SHA256 验票(常量时间比较,60s+540s
  时钟偏差容忍),与面板 sso.js 票据格式逐字符对齐
- auth.py 加 GET /sso 端点:无票 302 回面板签票,坏票 403,好票查账号
  签 JWT;复用 login-json 的 create_access_token + token_version 机制
- 前端 axios 401 拦截:JWT 过期自动跳 /api/v1/auth/sso 续期(面板有会话
  则无感续期);在 /login 页不跳 SSO 避免死循环
- settings 加 NETMGR_SSO_SECRET/PANEL_URL/DEFAULT_USER;.env.example 同步
- 与既有 csctalon→netmgr 方向(SSO_SHARED_SECRET)是两个独立密钥,不混用
- 不依赖 OpenResty 边缘网关:用户从面板入口主动跳入,www 站点保持纯反代
2026-09-23 13:49:15 +08:00

118 lines
6.1 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 客服中心管理系统 - 部署环境配置模板
# 复制为 .env 后按实际环境填写,切勿将真实 .env 提交到 git。
# docker-compose.yml 自动加载同目录 .env:db 用 ${} 插值,backend 经 env_file 注入。
# ---------- 运行模式 ----------
ENV=prod
DEBUG=false
SQL_ECHO=false
# ---------- 数据库 ----------
POSTGRES_USER=csctalon
POSTGRES_PASSWORD=<请修改为强密码>
POSTGRES_DB=csctalon
# Docker Compose 部署时填 db;本机直连时填 127.0.0.1
POSTGRES_HOST=db
POSTGRES_PORT=5432
# ---------- Redis ----------
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DB=0
# 生产必填(fail-fast: ENV=prod 时为空即拒绝启动); redis 容器据此设 requirepass
REDIS_PASSWORD=<请修改为强密码>
# ---------- JWT ----------
# 生产环境务必改为随机长字符串(建议 32+ 位)。注意:更换后已签发 token 失效、
# 且 CONFIG_ENCRYPTION_KEY 留空时同步源加密凭证由本 key 派生,更换会致旧凭证无法解密。
# ⚠️ 2026-08-20 审计 H-4:ENV=prod 时 fail-fast 会拒绝占位短语(含 please/change/random/请修改 等词)
# 与长度 <32 的 JWT_SECRET_KEY。轮换顺序(先凭证后 JWT,防同步凭证失联):
# 1) 生成新 CONFIG_ENCRYPTION_KEY(openssl rand -base64 32)
# 2) 用新 key 重加密 sync_source_configs 存量凭证(重跑 fix 脚本或管理界面重填)
# 3) 再更换 JWT_SECRET_KEY 并重启
JWT_SECRET_KEY=<请修改为随机长字符串>
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=1440
# 敏感配置加密 key(同步源凭证加密用);留空则从 JWT_SECRET_KEY 派生
# 生产建议显式设置独立随机 key(先于 JWT 轮换生效),避免 JWT 轮换连带凭证失联
CONFIG_ENCRYPTION_KEY=
# ---------- 跨站免密入口:管理员 → netmgr 网络管理面板(工单 #187)----------
# 本系统是签发方:管理员点入口 → 签 60 秒一次性 HMAC 票据 → 浏览器跳 netmgr 面板。
# ⚠️ SSO_SHARED_SECRET 必须与 netmgr 侧 /opt/netmgr/.env 的 SSO_SHARED_SECRET 逐字符一致
# (openssl rand -hex 32 生成,两侧各存一份)。留空 = 免密入口关闭(不影响本系统登录)。
SSO_SHARED_SECRET=
# netmgr 面板对外地址;本地/ZT 调试可临时改 http://10.147.17.34:6080
SSO_NETMGR_URL=https://panel.kimirock.top
# 票据有效期(秒),须与 netmgr 侧 TTL 一致,勿随意调大
SSO_TICKET_TTL_SECONDS=60
# talon 算力通道管理台直链(仅前端放链接,走 talon 可信网段免密,不签票)
# ⚠️ talon 没有公网入口,故给两个候选地址,前端按当前访问来源择一:
# 从办公网打开本页 → 用 _LAN;否则(公网域名 / ZT)→ 用 _ZT
# 两个都留空 = 不显示该入口。刻意不把它暴露到公网(见工单 #188)
SSO_TALON_URL_LAN=http://192.168.10.21:4080
SSO_TALON_URL_ZT=http://10.147.17.22:4080
# ---------- 跨子域 SSO(反向:netmgr 面板 → 本系统)----------
# 方向:本系统是消费方,netmgr 面板(panel.kimirock.top)是身份源。
# 面板管理员登录后 → 面板签 60 秒 HMAC 票据 → 302 到本系统 /api/v1/auth/sso
# → 本系统验票 → 复用自身登录链路签 JWT → 引导页写 localStorage。
# 与上方 SSO_SHARED_SECRET(本系统→面板方向)是两个独立密钥,不可混用。
# ⚠️ NETMGR_SSO_SECRET 必须与 netmgr 侧 /opt/netmgr/.env 的 SSO_CSCTALON_SECRET 逐字符一致
# (openssl rand -hex 32 生成,两侧各存一份)。留空 = 反向 SSO 关闭(不影响本系统登录)。
NETMGR_SSO_SECRET=
# 面板 SSO 签票入口(无票/票据过期时回跳此地址重新签票)
NETMGR_SSO_PANEL_URL=https://panel.kimirock.top/sso/csctalon
# 票据 sub 映射的本系统账号(面板固定签此用户名,须与本系统已存在且 active 的账号一致)
NETMGR_SSO_DEFAULT_USER=admin
# ---------- 上传 ----------
# 本地开发默认值 = 容器内相对路径(配合 compose 默认挂载 ./uploads:/app/uploads)。
# ⚠️ docker-compose.yml backend environment 已显式注入容器内路径
# UPLOAD_DIR=/app/uploads / BROWSER_STATE_DIR=/app/data/browser_states(覆盖 env_file 值),
# 故 .env 里的 UPLOAD_DIR 仅作 **compose 宿主机挂载源**(生产在 env.production.example 设
# /opt/csctalon/uploads 等宿主绝对路径), 不再是容器内读写路径(2026-09-06 修复路径错位)。
# ⚠️ 统一用单数 UPLOAD_DIR/BROWSER_STATE_DIR(与后端代码 settings 同名),
# 勿再用复数 UPLOADS_DIR/BROWSER_STATES_DIR(2026-08-30 已废弃, 配错会导致路径错配)。
UPLOAD_DIR=./uploads
MAX_UPLOAD_SIZE_MB=200
# Playwright 登录态保存目录(独立于 UPLOAD_DIR,不被静态文件挂载暴露)
BROWSER_STATE_DIR=./data/browser_states
# ---------- 跨域(局域网部署) ----------
CORS_ORIGINS=http://localhost,http://127.0.0.1
# ---------- 初始管理员(仅首次启动建账用;已建账后改此值不生效) ----------
INIT_ADMIN_USERNAME=admin
INIT_ADMIN_PASSWORD=<请修改默认密码>
# ---------- BMS 平台同步凭证 ----------
BMS_USERNAME=
BMS_PASSWORD=
# ---------- 定时同步 ----------
# 默认开启:否则跨日/重启后整小时同步窗口全部漏执行
BMS_SCHEDULE_AUTOSTART=true
# ---------- SCRM 白音平台凭证(仅 fix 脚本灌入用,运行时从 DB 读) ----------
# ⚠️ 严禁硬编码进脚本/入库;此处留空,通过环境变量或 .env 注入真实值
# OpenAPI 网关凭证
SCRM_CLIENT_ID=
SCRM_CLIENT_SECRET=
# Playwright 网页登录凭证(手机号/密码)
SCRM_WEB_USERNAME=
SCRM_WEB_PASSWORD=
# ---------- 微信扫码登录(2026-08-20 审计 H-1) ----------
# 生产必须配置真实 WECHAT_APPID/WECHAT_SECRET(微信开放平台/小程序),否则扫码登录/注册返回 503
# WECHAT_APPID=
# WECHAT_SECRET=
# 开发调试才允许 mock openid(且需 ENV=dev/test): 显式设为 true
WECHAT_MOCK_ALLOWED=false
# ---------- workbuddy 投诉数据推送鉴权(315投诉/卡商投诉同步) ----------
# 生产必填强随机串(openssl rand -hex 32),为空时同步接口返回 503。
# workbuddy 推送时携带请求头: Authorization: Bearer <该值>
WORKBUDDY_SYNC_TOKEN=<请修改为随机长字符串>