连接到 Heroku PostgreSQL 数据库时的身份验证错误
Posted
技术标签:
【中文标题】连接到 Heroku PostgreSQL 数据库时的身份验证错误【英文标题】:Authentication error when connecting to Heroku PostgreSQL database 【发布时间】:2012-05-04 00:43:49 【问题描述】:我正在使用 PostgreSQL 开发 Node.js 应用程序并托管在 Heroku 上。我的问题是我收到了这样的身份验证错误:
14:32:05 web.1 | [error: no pg_hba.conf entry for host "193.40.244.196", user "username", database "database_name", SSL off]
14:32:05 web.1 | length: 168,
14:32:05 web.1 | name: 'error',
14:32:05 web.1 | severity: 'FATAL',
14:32:05 web.1 | code: '28000',
14:32:05 web.1 | detail: undefined,
14:32:05 web.1 | hint: undefined,
14:32:05 web.1 | position: undefined,
14:32:05 web.1 | internalPosition: undefined,
14:32:05 web.1 | internalQuery: undefined,
14:32:05 web.1 | where: undefined,
14:32:05 web.1 | file: 'auth.c',
14:32:05 web.1 | line: '483',
14:32:05 web.1 | routine: 'ClientAuthentication'
这可能是 SSL 问题,但不应该像 here 中提到的那样。开箱即用应支持 SSL。所以我很困惑,只能问什么可能导致这个错误?
我不确定是否必须在我的系统上编辑 pg_hba.conf,但我什至找不到它。
【问题讨论】:
【参考方案1】:通过在 Heroku 上设置 PGSSLMODE
(http://www.postgresql.org/docs/9.0/static/libpq-envars.html) 解决了这个问题。它告诉 PostgreSQL 默认使用 SSL。
$ heroku config:set PGSSLMODE=require
【讨论】:
同意。这是最好的答案,因为它使我的本地和远程版本使用最少的代码。 这确实是最准确的答案,因为提供的其他解决方案没有使用 process.env.DATABASE_URL 太棒了!几个小时后,这是我的解决方案。谢谢。 升级我的 postgresql 实例devcenter.heroku.com/articles/… 时遇到了这个问题。 PGSSLMODE 是解决方法。 非常感谢!这应该是答案。【参考方案2】:node-postgres 在它的 javascript 绑定中不支持 SSL,如果你这样做,你正在使用它:
var pg = require('pg');
要获得 SSL,您需要通过以下方式使用本机绑定:
var pg = require('pg').native;
当您的应用在 Heroku 中运行时,您不需要使用 SSL,您只需要使用 SSL 进行远程连接(当您的应用在本地运行时)。
【讨论】:
不再需要本机绑定来运行 SSL。 为我工作...谢谢! (如果您使用的是 Sequelize,请将native: true
添加到 new Sequelize
选项对象)
这需要npm i pg-native
devcenter.heroku.com/articles/… 表示在连接前设置pg.defaults.ssl = true;
。【参考方案3】:
我添加了这些参数,现在可以从外部服务器连接到我的 heroku postgres 实例,特别是在 node express 服务器中的 knex.js 配置中:
var knex = require('knex')(
client: 'postgres',
connection: 'postgres://username:password@host:5432/yourdbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory'
);
【讨论】:
感谢 knex 示例!您在哪里找到这些信息? 不确定!但我看到它已记录在案,所以也许它在这里:devcenter.heroku.com/articles/… 这也帮助我使用 heroku postgre db 进行本地 nodejs 开发【参考方案4】:遇到了同样的问题。只需在 db 参数中启用 ssl=true。
var pg = require('pg');
var params = host: 'heroku_hostname',user: 'username',password: 'password',database: 'database',ssl: true ;
var client = new pg.Client(params);
client.connect();
【讨论】:
【参考方案5】:我自己遇到了这个问题,这是一个简单的修复。只需通过 HTTPS 连接
【讨论】:
通常只需将端口强制为heroku config
列出的端口的 5572 就足够了。
"改为通过 HTTPS 连接"。你能详细说明一下吗?您的意思是像 David Pelaez 建议的那样指定端口 5572 吗?这对我不起作用,也没有像其他人建议的那样在参数中指定 ssl: true ,也没有同时指定两者。我使用的是 javascript 绑定,而不是原生的。【参考方案6】:
我也在 2021 年 4 月在我的 Heroku PRODUCTION 实例中收到了 'ClientAuthentication'
no pg_hba.conf entry
错误。我曾经并继续使用 Plan“Hobby Dev”免费帐户。
Heroku 于 2021 年 2 月开始对平台进行更改,为所有 Heroku Postgres 客户端连接强制实施 SSL。 All Heroku Postgres client connections require SSL.
我通过在使用node-postgres v8 时添加以下配置ssl: rejectUnauthorized: false
修复了我的PRODUCTION 实例(我的NextJS 应用程序连接到Heroku Postgres 插件):
const pool = new Pool(
connectionString: process.env.DATABASE_URL,
ssl:
rejectUnauthorized: false
);
【讨论】:
【参考方案7】:const db = new Pool(
connectionString: process.env.DATABASE_URL,
...
ssl: rejectUnauthorized: false
);
我刚刚通过将ssl: rejectUnautorized: false
添加到我的数据库配置中解决了这个问题。另外,运行heroku config:set PGSSLMODE=no-verify -a appName
注意:“appName”应该是您托管应用程序的名称
【讨论】:
以上是关于连接到 Heroku PostgreSQL 数据库时的身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章
连接到 Heroku PostgreSQL 数据库时的身份验证错误
无法使用 sequelize 从本地节点应用程序连接到 heroku postgresql 数据库