[英]Authentication error when connecting to Heroku PostgreSQL database
我正在使用 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 問題,但不應該像這里提到的那樣。 開箱即用應支持 SSL。 所以我很難過,只能問什么可能導致這個錯誤?
我不確定是否必須在我的系統上編輯 pg_hba.conf,但我什至找不到它。
通過在 Heroku 上設置PGSSLMODE
( http://www.postgresql.org/docs/9.0/static/libpq-envars.html ) 解決了這個問題。 它告訴 PostgreSQL 默認使用 SSL。
$ heroku config:set PGSSLMODE=require
node-postgres 在它的 javascript 綁定中不支持 SSL,如果你這樣做,你正在使用它:
var pg = require('pg');
要獲得 SSL,您需要通過執行以下操作來使用本機綁定:
var pg = require('pg').native;
當您的應用在 Heroku 中運行時,您不需要使用 SSL,您只需要使用 SSL 進行遠程連接(當您的應用在本地運行時)。
我添加了這些參數,現在可以從外部服務器連接到我的 heroku postgres 實例,特別是在節點 express 服務器中的 knex.js 配置中:
var knex = require('knex')({
client: 'postgres',
connection: 'postgres://username:password@host:5432/yourdbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory'
});
遇到同樣的問題。 剛剛在 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();
我自己遇到了這個,這是一個簡單的修復。 只需通過 HTTPS 連接即可
我也在 2021 年 4 月在我的 Heroku PRODUCTION 實例中收到了'ClientAuthentication'
no pg_hba.conf entry
錯誤。我曾經並繼續使用 Plan“Hobby Dev”免費帳戶。
Heroku 於 2021 年 2 月開始對平台進行更改,為所有 Heroku Postgres 客戶端連接強制實施 SSL。 所有 Heroku Postgres 客戶端連接都需要 SSL 。
我修復了我的 PRODUCTION 實例(我的 NextJS 應用程序連接到 Heroku Postgres 插件),方法是在使用node-postgres v8時添加以下配置ssl: { rejectUnauthorized: false }
:
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
});
const db = new Pool({
connectionString: process.env.DATABASE_URL,
...
ssl: { rejectUnauthorized: false }
});
我剛剛通過將ssl: { rejectUnautorized: false }
添加到我的數據庫配置中解決了這個問題。 另外,運行heroku config:set PGSSLMODE=no-verify -a appName
注意:“appName”應該是您托管的應用程序的名稱
有同樣的問題。 這對我有幫助。
new Sequelize(process.env.DATABASE_URL, {
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.