连接到 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 数据库

如何在 Heroku for Node 应用程序上设置环境变量并连接到 PostgreSQL 数据库?

postgres服务器拒绝连接到heroku

连接到Heroku Postgres数据库需要很长时间

将 PowerBI Cloud 连接到 PostgreSQL