【发布时间】:2019-11-18 21:04:30
【问题描述】:
我真的很想让我的一些秘密/密钥是可迭代的,因为我有越来越多的外部 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 在两个脚本之间传递数据是否也很安全?
【问题讨论】:
-
此方案是否需要一个 JSON 配置文件,然后您可以从代码中动态读取该文件。不知道为什么你觉得它必须在环境变量中。
-
@jfriend00 不一定,就像我提到的标准输入。但是一个 json 文件会在同一个目录中,并且更难隔离权限。
-
JSON 文件可以位于您想要的任何位置。它不必与您的代码位于同一目录中。我想我不遵循问题的逻辑。您将从某处的文件中读取这些值。我不明白为什么你必须从文件中读取它们,然后将它们放在其他地方(在 stdin 中的环境中),然后让程序读取它们,而不是让程序直接从它们所在的配置文件中读取它们'最初存储。
-
如果它是直接读取它,则意味着应用程序对其具有读取权限,如果它是其他东西,那么它可能只是对其具有权限的进程管理器。我想我希望我可以加载它,这样除了需要它的范围之外,秘密及其来源对所有人来说都是不可见或模糊的。
-
好吧,某种启动管理器可以在 stdio 中粘贴一大块 JSON,然后您的服务器可以从那里读取它(并且不知道它来自哪里)。我真的不认为自己如何更安全,但你当然可以这样做。
标签: node.js security environment-variables secret-key