Skip to content
Usuario

Backend Deployment

El backend vive en F:\HemiaAssistantGlobal\hemia-assistance-back-legacy. Es un proyecto Node/Express con Sequelize y MySQL.

package.json declara:

ScriptComandoUso
devnpm run dev:d2Desarrollo/local default con D2 cookie auth HTTP.
dev:d2node scripts/dev-auth-mode.js d2Desarrollo/local explicito con cookies D2.
dev:legacynode scripts/dev-auth-mode.js legacyRegresion local opt-in con Authorization legacy.
startnode src/index.jsArranque sin nodemon.

No hay script de lint, build ni migraciones en package.json.

  1. Preparar host o contenedor con Node compatible y acceso a MySQL.
  2. Instalar dependencias con el metodo aprobado de release:
Terminal window
npm install
  1. Crear archivo de entorno en el mecanismo de la plataforma. No copiar .env.local ni valores historicos.
  2. Configurar DB, JWT, refresh, password reset, CSRF, CORS, cookies, SMTP y storage.
  3. Validar conectividad a DB con usuario de minimo privilegio.
  4. Revisar si hay SQL manual pendiente en Scripts_; no hay comando automatico de migracion.
  5. Levantar backend:
Terminal window
npm run start
  1. Confirmar que startup no falla por validateStartupConfig().
  2. Revisar logs iniciales sin exponer secretos.
  3. Ejecutar smoke tests de health/auth.

El backend llama SecurityConfig.validateStartupConfig() en src/index.js. En production-like debe fallar si:

  • REQUIRE_ACTIVE_SESSION no es true.
  • JWT_SECRET falta, es default o debil.
  • REFRESH_TOKEN_SECRET falta o es debil.
  • PASSWORD_RESET_CODE_SECRET falta o es debil.
  • REFRESH_TOKEN_ROTATION_ENABLED=false.
  • CORS permite wildcard en production-like.
  • CORS_CREDENTIALS=true se combina con wildcard.
  • La autenticacion por cookies no tiene CSRF_ENABLED=true.
  • La autenticacion por cookies no tiene CORS credentials y allowlist exacta.
  • CSRF_TOKEN_SECRET falta o es debil con CSRF activo.
  • CSRF_ALLOWED_ORIGINS falta en production-like con origin check activo.

Ejemplo conceptual. Usa el secret manager de tu plataforma, no pegues secretos en consola compartida.

Terminal window
$env:NODE_ENV='production'
$env:APP_ENV='production'
$env:PORT='3009'
$env:DB_HOST='<db-host>'
$env:DB_PORT='3306'
$env:DB_NAME='medsync_prod'
$env:DB_USER='medsync_app'
$env:DB_PASSWORD='<from-secret-manager>'
$env:JWT_SECRET='<from-secret-manager>'
$env:REFRESH_TOKEN_SECRET='<from-secret-manager>'
$env:PASSWORD_RESET_CODE_SECRET='<from-secret-manager>'
$env:CSRF_TOKEN_SECRET='<from-secret-manager>'
$env:REQUIRE_ACTIVE_SESSION='true'
$env:AUTH_COOKIE_MODE='d2'
$env:BROWSER_AUTH_TRANSPORT='cookie'
$env:AUTH_COOKIE_SECURE='true'
$env:AUTH_COOKIE_SAMESITE='lax'
$env:AUTH_COOKIE_DOMAIN=''
$env:AUTH_COOKIE_MAX_AGE_MODE='session'
$env:CSRF_ENABLED='true'
$env:CORS_CREDENTIALS='true'
$env:CORS_ALLOWED_ORIGINS='https://app.<dominio>'
$env:CSRF_ALLOWED_ORIGINS='https://app.<dominio>'
npm run start

No se observo endpoint /health dedicado. Usa checks no destructivos:

CheckEsperado
GET /api/auth/session sin cookies200 con authenticated:false o contrato equivalente.
GET /api/auth/csrf desde origen permitido200, cookie CSRF y payload con csrfToken, headerName, expiresAt.
Preflight CORS permitido204 con Access-Control-Allow-Origin exacto y credentials.
DB startup logConexion MySQL OK, sin imprimir password.

Validar que el modo de cookies esta activo

Section titled “Validar que el modo de cookies esta activo”
  • Logs de seguridad deben mostrar AUTH_COOKIE_MODE=d2.
  • Logs de seguridad deben mostrar BROWSER_AUTH_TRANSPORT=cookie.
  • El resumen tecnico puede mostrar D2_COOKIE_AUTH_ENABLED=true; ese nombre es un indicador interno del codigo.
  • Login exitoso debe setear cookies access/refresh HttpOnly.
  • Respuesta JSON de login no debe incluir token ni refresh_token.
  • GET /api/auth/session debe devolver usuario/rol/permisos sin tokens.

Validar que legacy no es el contrato navegador

Section titled “Validar que legacy no es el contrato navegador”

En navegador production-like:

  • No debe existir header Authorization en requests de auth de usuario.
  • Frontend no debe tener access token ni refresh token en localStorage.
  • Frontend no debe tener access token ni refresh token en sessionStorage.
  • document.cookie no debe mostrar access/refresh porque son HttpOnly.
  • Solo la cookie CSRF puede ser visible a JavaScript.

Depende del supervisor real. Si se usa systemd/PM2/container/orquestador, documentar aqui en la runbook interna:

stop: <comando-supervisor-stop>
start: <comando-supervisor-start>
restart: <comando-supervisor-restart>
logs: <comando-supervisor-logs>

No usar Stop-Process manual como procedimiento productivo salvo emergencia controlada.