FATAL: password authentication failed for user "app"
#Что на самом деле проверяет сервер
Сообщение одинаково для нескольких разных ситуаций: пароль неверен, у роли пароль вообще не задан, имя роли отличается регистром, либо в pg_hba.conf для вашего адреса прописан метод, который клиент не может выполнить. Сервер намеренно не уточняет детали, а подробную причину пишет только в собственный журнал — смотреть нужно его.
sudo tail -n 30 /var/log/postgresql/postgresql-16-main.logsudo journalctl -u postgresql -n 30 --no-pagerНомер версии в имени файла (16) подставьте свой: ls /var/log/postgresql/.
#Разбор причин
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный парольОпечатка, другая раскладка, лишний пробел при копировании или пароль из другого окружения. | В журнале «Password does not match». | Задайте новый пароль через ALTER USER. |
| Пароль у роли не заданПользователь создан без PASSWORD. | В журнале «has no password assigned». | Задайте пароль командой из шага ниже. |
Не то имя пользователяИмена в кавычках чувствительны к регистру: "App" и app — разные роли. | Пользователь, которого вы вводите, отсутствует в \du. | Используйте точное имя из списка ролей. |
| Другой метод в pg_hba.confВ выбранном по адресу/роли правиле задан неподходящий метод аутентификации или роль не имеет пароля нужного типа. Метод md5 в pg_hba.conf может автоматически использовать SCRAM, если у роли сохранён SCRAM-пароль. | Проблема воспроизводится у конкретного клиента и правила; детали видны в журнале сервера. | Проверьте применённое правило и совместимость клиента с SCRAM, исправляйте настройку только после резервного копирования. |
Старый клиентlibpq до версии 10 не умеет scram-sha-256. | Ошибка только из старого приложения. | Обновите библиотеку libpq или драйвер до версии с поддержкой SCRAM; не ослабляйте серверную аутентификацию ради устаревшего клиента. |
#Пошаговая проверка авторизации
- Убедитесь, к какому серверу подключаетесьВ настройках приложения выпишите host, port, database и user, не публикуя пароль. Сверьте порт и имя базы с рабочим окружением: тестовая и промышленная базы могут иметь одинаковые имена ролей, но разные пароли. Если ошибка начинается с
password authentication failed, соединение дошло до PostgreSQL; изменение настроек сетевого порта обычно не исправит эту ошибку. - Прочитайте журнал сервера и проверьте имя ролиНа сервере Linux откройте терминал. Если у вас есть административный доступ, выполните
sudo journalctl -u postgresql -n 50 --no-pager; на Debian/Ubuntu журнал конкретного кластера можно найти в/var/log/postgresql/. Запишите время ошибки и имя роли, не копируя чужие пароли. При допустимом локальном доступе запуститеsudo -u postgres psqlи внутри psql выполните\du. Если роль отсутствует, проверьте экземпляр PostgreSQL; не создавайте автоматически новую роль. - Проверьте правило доступа для фактического клиентаВ том же сеансе psql выполните
SHOW hba_file;и откройте показанный файл только на чтение. Правила проверяются сверху вниз, применяется первое подходящее. Сверьте адрес клиента, базу, роль и метод. Для ошибок разбора можно выполнитьSELECT line_number,error FROM pg_hba_file_rules WHERE error IS NOT NULL;. Изменять правила нужно с резервной копией, для конкретной подсети и только администратору;trustне используйте. - При необходимости согласованно задайте новый парольЕсли пароль действительно утрачен, администратор БД, войдя в нужный экземпляр через psql, выполняет
\password app, гдеapp— реальное имя роли. Введите новый пароль дважды в ответ на запрос psql; не пишите его в командной строке, заметках или URL. Затем обновите секрет в конфигурации приложения и безопасно перезапустите только его соединения. Не меняйте пароль роли без согласования с владельцем работающих систем. - Повторно проверьте вход с реального клиентаНа клиентском компьютере откройте терминал с установленным psql и введите
psql -h 192.168.1.20 -p 5432 -U app -d appdb -W, заменив адрес, порт, роль и базу на реальные. Введите пароль в интерактивном запросе. Если открылась строка приглашения psql, соединение и аутентификация успешны; завершите сеанс через\q. Если ошибка повторяется, уточните сообщение и время в журнале, не ослабляя аутентификацию.
#Сброс пароля
Если у вас есть права системного администратора сервера, на Debian/Ubuntu с настроенной локальной peer-аутентификацией можно открыть psql от имени postgres. На других платформах способ входа администратора может отличаться. Перед сменой пароля убедитесь, что подключены к нужному экземпляру и согласовали изменение с владельцем приложения; новый пароль потребуется обновить в его защищённой конфигурации.
sudo -u postgres psqlapp — пример имени существующей роли, замените его на реальное. \password запрашивает секрет интерактивно и не вставляет его в SQL-журнал или историю.\du\password appЕсли роли нет, сначала выясните, к правильному ли кластеру и базе подключаетесь. Создание роли и базы — отдельная операция администратора с заданием минимально необходимых прав; не выполняйте её автоматически ради устранения ошибки пароля. Учтите: изменение password_encryption не пересчитывает имеющиеся хеши; при согласованной смене метода пароль задаётся заново.
#Метод входа в pg_hba.conf
Файл разбирается сверху вниз, срабатывает первая подходящая строка. Найти его: sudo -u postgres psql -c "SHOW hba_file;".
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
host appdb app 127.0.0.1/32 scram-sha-256
host appdb app 192.168.1.0/24 scram-sha-256На Linux/Unix изменения pg_hba.conf применяются после перечитывания конфигурации (SELECT pg_reload_conf(); из psql администратора); в Windows новые подключения обычно используют обновлённый файл сразу. Полный перезапуск для этих правил не нужен. Изменяйте правила только для нужных базы/роли и адреса клиента; не заменяйте метод входа на trust ради обхода ошибки. Проверьте подключение с клиента командой psql -h 127.0.0.1 -U app -d appdb -W, заменив параметры на фактические.
psql -h 127.0.0.1 -U app -d appdb -WВ URL-строке подключения специальные символы внутри пароля должны быть закодированы в процентах по правилам URL; более надёжный вариант — передавать параметры подключения раздельно через драйвер или защищённый секрет. Не печатайте пароли и не сохраняйте их в открытом виде в конфигурации. Успех — подключение проходит без FATAL, а приложение использует обновлённые учётные данные.