首页 > 解决方案 > 有没有办法运行一个可以将变量传递给下一个的自终止 js 脚本?

问题描述

我真的很想让我的一些秘密/密钥是可迭代的,因为我有一个不断增长的外部 api 密钥列表,如果我可以根据正在使用的路由匹配它们,而不必静态映射它们,它们会更容易使用在我的申请开始时。

我能想到更好地组织它们而不在批处理/bash文件中编写大量JSON单行字符串的唯一方法是将它全部定义在js对象文字中并让js脚本对其进行字符串化并将其加载到ENV变量中传递给即将启动的应用程序。

NPM 预启动脚本:

const env = {
  secret: 'supersecret',
  key: `key
  that requires
  line breaks`,
  apiKeys: {
    'api-1':'a;sodhgfasdgflksdaj;lg',
    'api-2':'ajl;sdfj;adjsfkljasd;f'
  }
}

for (let x in env) {
  if (typeof env[x] == 'string') {
    process.env[x] = env[x];
  } else {
    process.env[x] = JSON.stringify(env[x])
  }
  console.log(x)
}

process.exit(22);

NPM 启动脚本:

const key = process.env.key
const apiKeys = JSON.parse(process.env.apiKeys)

不幸的是,ENV 变量不会保留在实例之间,因此这是无用的。

使用 STDIN 和 STDOUT 在两个脚本之间传递数据是否也很​​安全?

标签: node.jssecurityenvironment-variablessecret-key

解决方案


我的解决方案最终是通过转换为 JSON 来管道输出,然后流式传输到 STDOUT 并在第二个脚本上的 STDIN 上接收。这样做使它与平台无关,我可以在源脚本中添加任何类型的活动秘密管理(例如,接受来自各种其他秘密管理系统/保险库的秘密或在每次启动时生成新秘密)

发送到标准输出:

const env = {
   someSecret: 'supersecret',
   superSecretObject: {
      moreProperties: 'data'
   }
};
/* If you have an array of properties or have a very large set of secrets, 
you should create a readable stream from it, and send that to stdout, 
but this is much simpler */
process.stdout.write(JSON.stringify(env));

在标准输入上接受:

const fs = require('fs')
const env = (function () {
/* Using fs will error out on no input, but you can use process.stdin 
   if you don't need to suspend the whole application waiting for the input */
    let envTmp = fs.readFileSync(0).toString();
    envTmp = JSON.parse(envTmp);
    return envTmp;
})();

推荐阅读