如何为iam身份验证更新数据库连接

问题描述 投票:0回答:1

使用IAM数据库身份验证,密码将在15分钟后过期。因此,理想情况下,我必须在密码过期之前更新数据库连接。我在数据库的首次初始化上设置了一个计时器,并在每个查询中查询传递的时间。如何在密码过期之前刷新连接的密码?或者,如有必要,我该如何销毁旧数据库对象并更新该对象?

错误消息是:“用户iam_user的PAM身份验证失败。

获取IAM密码的代码:

const pgp = require('pg-promise')();
const AWS = require('aws-sdk');
const ca =
  '-----BEGIN CERTIFICATE-----\nMIID9DCCAtyg...
   ...wZfTUU=\n-----END CERTIFICATE-----\n';

const signer = new AWS.RDS.Signer({
  region: process.env.REGION,
  username: process.env.DATABASE_USER,
  hostname: process.env.DATABASE_HOST,
  port: parseInt(`${process.env.DATABASE_PORT}`, 10),
});

module.exports = pgp({
  host: process.env.DATABASE_HOST,
  port: process.env.DATABASE_PORT,
  database: process.env.DATABASE_NAME,
  user: process.env.DATABASE_USER,
  ssl: { ca },
  dialectOptions: { ssl: { require: true } },
  password: signer.getAuthToken(),
});

将db对象注入graphql:

const db = require('../db/init');
server.use(
    mount(
      '/graphql',
      graphqlHTTP( () => ({
        schema: schema,
        context: { startTime: Date.now(), db },
        graphiql: true
      })),
    ),
  );

在解析器中使用数据库。

我可以查询数据库连接的创建时间。如有必要,可以更新密码吗?或销毁旧数据库对象并创建新数据库对象的最佳方法是什么?

const resolvers = {
Query: {
    Post: (root, args, {db}) => {
      console.log(args.id);
      console.log(db.$config.options)
      const postQuery = new PQ({
        text:
          'SELECT post_id as id FROM tbl_post where post_id = $1',
        values: [parseInt(args.id, 10)],
      });
      return db.one(postQuery).catch((err) => console.log(err));
    }
}
aws-sdk pg-promise
1个回答
0
投票

正如vitaly所建议-我使用了密码功能。为避免增加延迟,此功能仅每15分钟更新一次密码。如果以少于10秒的间隔连续使用该池,则该连接将保持打开状态,而根本不调用密码功能。根据我的测试,根本没有打开与数据库的新连接。

const ca = '-----BEGIN CERTIFICATE-----\9DC...-----END CERTIFICATE-----\n';

const signer = new AWS.RDS.Signer({
    region: process.env.REGION,
    username: process.env.DATABASE_USER,
    hostname: process.env.DATABASE_HOST,
    port: parseInt(`${process.env.DATABASE_PORT}`, 10),
});

const SIGNER = { time: 0, password: undefined};

function getSignedPassword() {
    const time = Date.now();
    if (time - SIGNER.time > 900000) {
        SIGNER.time = new Date().getTime();
        SIGNER.password = signer.getAuthToken();
        return SIGNER.password;
    }
  return SIGNER.password;
}

module.exports = pgp({
    host: process.env.DATABASE_HOST,
    port: process.env.DATABASE_PORT,
    database: process.env.DATABASE_NAME,
    user: process.env.DATABASE_USER,
    ssl: { ca },
    password: getSignedPassword,
});
© www.soinside.com 2019 - 2024. All rights reserved.