Errore PostgreSQL: password authentication failed for user
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: password authentication failed for user "app_user"
Hai raggiunto il server, pg_hba.conf ha selezionato un metodo di autenticazione basato su password per questa connessione, e il controllo della password è fallito. Il messaggio al client è deliberatamente vago; il log del server di solito dice di più.
Cosa significa questo errore
Al client viene detto solo "authentication failed" — è intenzionale, per evitare di far trapelare informazioni agli attaccanti. Il log del server, invece, registra il motivo sottostante allo stesso timestamp: il ruolo senza password assegnata, la password che non corrisponde, o il formato della password memorizzata non utilizzabile con il metodo di autenticazione che pg_hba.conf richiede.
Quest'ultimo merita una parola: le password sono memorizzate come hash, usando l'algoritmo che password_encryption aveva quando la password è stata impostata (scram-sha-256 nelle versioni moderne, md5 storicamente). Cambiare password_encryption o il metodo pg_hba non converte le password già memorizzate — i mismatch emergono come login falliti per password "sicuramente giuste".
Cause comuni
- Password sbagliata o utente sbagliato — incluso "password giusta, ambiente sbagliato": credenziali di staging contro produzione, o una port mapping Docker che punta a un'istanza diversa da quella che pensi.
- Il ruolo non ha una password impostata (creato con
CREATE ROLEe mai fornito di una). Qualsiasi password fallisce; solo il log del server dice perché. - Mismatch SCRAM/md5: password memorizzata come md5 mentre pg_hba richiede
scram-sha-256, o una libreria client molto vecchia che non parla SCRAM. - Caratteri speciali in una URI di connessione (
@,:,/,#nella password) non con percent-encoding, così la password interpretata non è quella che hai digitato.
Come diagnosticarlo
- Leggi il log del server al timestamp del fallimento — quasi sempre indica la vera causa.
- Controlla quale regola pg_hba corrisponde alla connessione:
SELECT * FROM pg_hba_file_rules;mostra le regole interpretate in ordine (vince la prima corrispondenza). - Testa con
psqldirettamente, togliendo dall'equazione l'applicazione, il parsing della URI e il pooler:psql "host=... user=app_user dbname=appdb"e digita la password interattivamente.
Come risolverlo
- Reimposta la password — preferisci il
\passworddi psql a un plain SQL statement, così la nuova password non finisce nel log del server o nella cronologia della shell:\password app_user - Allinea lo stack su SCRAM: imposta
password_encryption = 'scram-sha-256', usascram-sha-256in pg_hba.conf, e reimposta ogni password dopo il cambiamento così gli hash memorizzati corrispondono. - Fai il percent-encoding delle password nelle URI, oppure passa la password via
PGPASSWORD/.pgpass/parametri di connessione invece che via URI.
