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.
¿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
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts