Saltar al contenido principal
PostgreSQL

PostgreSQL: FATAL: password authentication failed for user

Cómo resolver el error de autenticación 'password authentication failed' en PostgreSQL. Solución para psql, pgAdmin, Prisma y connection strings.

Error: FATAL: password authentication failed for user

¿Por qué ocurre?

PostgreSQL rechaza la conexión porque: - La contraseña es incorrecta o ha cambiado - El usuario no existe en PostgreSQL (aunque exista en el sistema operativo) - El método de autenticación en `pg_hba.conf` no permite contraseñas (usa `peer` o `ident`) - La connection string tiene caracteres especiales en la contraseña sin encodear - Intentas conectarte como `postgres` pero sin ser el usuario `postgres` del sistema

Solución paso a paso

1. Conectarse como usuario postgres del sistema y resetear contraseña

# Cambiar al usuario postgres del sistema
sudo -i -u postgres

# Entrar a psql psql

# Resetear contraseña del usuario postgres ALTER USER postgres WITH PASSWORD 'nueva_contraseña_segura';

# O para otro usuario ALTER USER mi_usuario WITH PASSWORD 'nueva_contraseña';

\q exit

2. Verificar que el usuario existe

-- En psql como superusuario
\du

-- Crear usuario si no existe CREATE USER mi_usuario WITH PASSWORD 'contraseña' CREATEDB;

3. Modificar pg_hba.conf (método de autenticación)

# Encontrar pg_hba.conf
sudo -u postgres psql -c "SHOW hba_file;"

# Editar el archivo (ejemplo en Ubuntu) sudo nano /etc/postgresql/16/main/pg_hba.conf

Cambiar peer o ident por md5 o scram-sha-256:
# Antes:
local   all   postgres   peer

# Después: local all postgres md5

# Recargar configuración
sudo systemctl reload postgresql

4. Connection string con caracteres especiales

# ❌ Contraseña con @ o # en la URL rompe el parsing
DATABASE_URL="postgresql://user:p@ss#word@localhost/db"

# ✅ Encodear caracteres especiales # @ = %40, # = %23, $ = %24 DATABASE_URL="postgresql://user:p%40ss%23word@localhost/db"

# ✅ O mejor, usar variables separadas en el código

// En lugar de connection string, usar objeto
const client = new Client({
  host: 'localhost',
  user: 'mi_usuario',
  password: process.env.DB_PASSWORD, // sin URL encoding
  database: 'mi_db',
  port: 5432,
});

5. Verificar la conexión

psql -U mi_usuario -h localhost -d mi_base_datos
# Te pedirá la contraseña interactivamente

Cómo evitarlo en el futuro

- Guarda las credenciales en variables de entorno (`.env`), nunca hardcodeadas - Usa un gestor de secretos (Vault, AWS Secrets Manager) en producción - Encodea siempre los caracteres especiales en las URLs de conexión - Documenta el método de autenticación de `pg_hba.conf` en el README del proyecto

PostgreSQLautenticaciónpsqlpg_hbacontraseña

¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:

Generador de Prompts

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.