为什么我的数据库没有密码时 Knex.js 密码验证失败?

Why Is Knex.js Failing on Password Authentication When My Database Has No Password?

我正在尝试使用 Knex 连接到我的数据库,如下所示:

const client = knex({
  client: 'postgresql',
  connection: {
    host: '127.0.0.1',
    user: 'me',
    database: 'my_db'
  }
});
client('some_table').then(console.log);

当我创建数据库时(在命令行中使用 createdb my_db)我没有设置密码。在命令行我可以 运行 psql -d my_db 并且它工作得很好。

但是,当我尝试使用 Knex 时,出现错误:

Unhandled rejection error: password authentication failed for user "me"

无论我设置 null 密码、空字符串 ('') 密码,还是完全不配置该字段,都会发生这种情况。

任何人都可以解释为什么 Knex 坚持密码验证失败......当没有密码时(以及我什么时候可以在命令行中没有密码就可以连接)?

PostgreSQL 不允许基于 presence/absence 密码登录。相反,所有登录身份验证都是通过 pg_hba.conf 处理的。在您的特定情况下——创建没有密码的 me 用户(或使用 null'',如您所描述的那样)——缺少密码不一定允许您的用户登录。事实上,不设置密码将不允许该用户登录,除非 pg_hba.conf 设置为某些无密码设置(即 peertrust)。

如果你想 me 用户无密码登录(我假设是为了 testing/development 目的,因为无密码登录在生产中不是好的安全实践),你可以简单地设置trust 级身份验证 pg_hba.conf:

#conn_origin  database  user  ip_mask   auth_method
host          all       me    0.0.0.0/0 trust

实现无密码身份验证的更安全方法是使用 .pgpass 文件或设置 PGPASSWORD 环境变量。看到您正在尝试使用 knex.js,您最好像上面那样调整 pg_hba.conf。再一次,我不知道你的意图是什么,但请注意安全 ;)

披露:我为 EnterpriseDB (EDB)

工作