1

我正在使用 azure-keyvault 存储机密,我想在我的配置文件中使用机密,但在回调时遇到了一些问题。问题是在调用 bookshelf.js 之前秘密没有返回,并且密码未定义

配置.js:

var environment = process.env.NODE_ENV || 'development';
module.exports = require('./env/' + environment + '.js');

keyvault.js:

var sqlPassword =  function(){
      var promise = new Promise(
        function resolver(resolve, reject) {
            var secretId = secrectUri + 'secrets/password';
            client.getSecret(secretId, function(err, result) {
                if (err) throw err;
                resolve(result.value);
            });
        }
      );
};

module.export = {
    sqlPassword: sqlPassword()
};

env/development.js

var secret = require('../keyvault');

module.exports = {
    db: {
        client: 'mysql',
        connection: {
            host     : '127.0.0.1',
            user     : 'sa',
            password : secret.sqlPassword,
            database : 'avin',
            charset  : 'utf8'
        },
        debug: true
    }
};

书架.js

var config = require('./config');

var knex = require('knex')(config.db);
var bookshelf = require('bookshelf')(knex);
bookshelf.plugin('registry');

module.exports = bookshelf;

应用程序.js

var config = require('./config/config');

var express = require('express');
var app = express();
var bookshelf = require('./config/bookshelf');

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(8000, function () {
  console.log('Example app listening on port 8000!');
});
4

2 回答 2

1

您的代码有两个问题。

首先,您声明了该promise对象,但从未调用它。

keyvault.js

var sqlPassword =  function(){
  //promise code
  return promise;
};

module.exports = {
  sqlPassword: sqlPassword
};

env/development.js

module.exports = {
   db: {
      //some other code
      connection: {
        password : secret.sqlPassword().then(function(result){
           return result;
        }),
      },
      //some other code
   }
};

希望能帮助到你。

于 2016-06-12T10:29:26.770 回答
0

该软件包azure-keyvault已被弃用,取而代之的是新软件包以分别处理 Keyvault 密钥、机密和证书。对于您的方案,您可以使用新的@azure/keyvault-secrets包。

新包中的方法使用 Promise 而不是回调。这应该会大大简化您的代码。要从旧包中迁移您的应用程序,您可以查看迁移指南,其中列出了主要差异以及需要注意的事项。

您的代码的主要更改是:

var sqlPassword =  async function(){
  const credential = new DefaultAzureCredential();
  const client = new SecretClient(KEY_VAULT_URI, credential);
  const secret = await client.getSecret(secretName);
  return secret.value;
};

若要了解 DefaultAzureCredentiual 的工作原理,请参阅@azure/identity 的自述文件

于 2020-12-22T02:16:00.770 回答