name: Check Auth Flags (只读诊断) # 只读:打印生产 .env 里【登录相关开关】的值。不打印任何密钥/AppSecret/AccessKey。 # # 要确认的事:生产上 ALLOW_STUB_LOGIN 是不是 true。 # 如果是 true 且没接真实短信服务商,那么 POST /api/auth/sms/send 会把 6 位验证码 # 【直接放进 HTTP 响应里返回】——任何人填上别人的手机号,就能拿到验证码, # 再调 /sms/verify 直接登录成那个人的账号。这不是"测试便利",这是一扇开着的门。 on: workflow_dispatch: jobs: check: runs-on: ubuntu-latest steps: - name: Print auth flags (no secrets) uses: appleboy/ssh-action@v1 with: host: ${{ secrets.ECS_HOST }} username: ${{ secrets.ECS_USER }} password: ${{ secrets.ECS_PASSWORD }} command_timeout: 3m script: | set -e cd /var/www/digitalme-api.invoratec.cn [ -f .env ] || { echo "❌ 生产 .env 缺失"; exit 1; } echo "===== 生产登录相关开关(只看开关,不看密钥)=====" for k in NODE_ENV ALLOW_STUB_LOGIN SMS_PROVIDER EMAIL_PROVIDER FEATURE_MARKETPLACE; do v=$(grep -E "^${k}=" .env | head -1 | cut -d= -f2- || true) printf '%-22s = %s\n' "$k" "${v:-(未设置)}" done echo echo "===== 是否配了真实短信/微信(只判断有没有,不打印值)=====" for k in ALIYUN_ACCESS_KEY_ID WECHAT_APP_ID; do if grep -qE "^${k}=.+" .env; then echo "$k = 已配置"; else echo "$k = 未配置"; fi done echo echo "===== 结论 =====" STUB=$(grep -E '^ALLOW_STUB_LOGIN=' .env | head -1 | cut -d= -f2- || true) SMSP=$(grep -E '^SMS_PROVIDER=' .env | head -1 | cut -d= -f2- || true) if [ "$STUB" = "true" ] && [ "$SMSP" != "aliyun" ]; then echo "🔴 危险:ALLOW_STUB_LOGIN=true 且没接真实短信服务商。" echo " → /api/auth/sms/send 会把验证码放进响应里返回。" echo " → 任何人填别人的手机号即可拿到验证码,然后登录成那个人。" echo " → 手机注册的账号目前全部可被任意接管。" elif [ "$STUB" = "true" ]; then echo "🟡 注意:ALLOW_STUB_LOGIN=true,但短信走的是 aliyun(真实发送)。" echo " 短信这条路是安全的;但微信仍是 mock 扫码,建议一并关掉 stub。" else echo "🟢 安全:ALLOW_STUB_LOGIN 未开启,验证码不会出现在响应里。" fi