我真的希望我的一些秘密/密钥是可迭代的,因为我有越来越多的外部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在两个脚本之间传递数据也是安全的吗?
发布于 2019-11-20 03:53:07
我的解决方案最终是通过转换为JSON来管道输出,然后流式传输到STDOUT,并在第二个脚本上接收STDIN。这样做使得它与平台无关,我可以在源脚本中添加任何类型的活动秘密管理(例如,接受来自各种其他秘密管理系统/保险库的秘密,或者在每次启动时生成新的秘密)。
发送到STDOUT:
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));
Accept on STDIN:
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;
})();
https://stackoverflow.com/questions/58922876
复制相似问题