天蓝色密钥保险库上的回调

时间:2016-06-12 09:26:48

标签: node.js express azure-keyvault

我正在使用azure-keyvault来保存秘密,我想在我的配置文件中使用这个秘密,但在回调时面临一些问题。问题是在调用bookshelf.js之前没有返回密码,密码是未定义

config.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
    }
};

bookshelf.js

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

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

module.exports = bookshelf;

app.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!');
});

2 个答案:

答案 0 :(得分: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
   }
};

希望,这有帮助。

答案 1 :(得分:0)

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

新包中的方法使用承诺而不是回调。这应该会大大简化您的代码。要将您的应用程序从旧包中移出,您可以查看 migration guide,其中列出了主要差异和需要注意的内容。

对您的代码的主要更改是:

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 的工作原理,请参阅 readme for @azure/identity

相关问题