Javascript Express应用程序中存储机密的最佳实践

Javascript Express应用程序中存储机密的最佳实践,javascript,node.js,amazon-web-services,aws-lambda,aws-secrets-manager,Javascript,Node.js,Amazon Web Services,Aws Lambda,Aws Secrets Manager,我使用express和AWS lambda创建了一个简单的NodeJSRESTAPI。我一开始使用环境变量,现在我的API中都有process.env 然而,我刚刚开始在AWS中测试secretmanager。它似乎工作得很好。我构建了一个模块getAWSsecrets.js,通过简单运行即可轻松访问: async function testFunc() { let credentials = await getSecrets(); console.log(credentials); }

我使用express和AWS lambda创建了一个简单的NodeJSRESTAPI。我一开始使用环境变量,现在我的API中都有process.env

然而,我刚刚开始在AWS中测试secretmanager。它似乎工作得很好。我构建了一个模块getAWSsecrets.js,通过简单运行即可轻松访问:

async function testFunc() {
  let credentials = await getSecrets();
  console.log(credentials);
}
这正按照预期工作,getSecrets()方法返回一个json对象,其中包含我需要的所有机密。但在我的应用程序中的每个位置,我都需要发出这个API请求来获取秘密。是否有更好的方法来以某种方式缓存机密,以避免反复呼叫secretmanager

话虽如此,也许它是最安全的?我如何进行,什么是最佳实践?也许这不是问题,只是我的直觉告诉我这看起来“笨重”。

在每次冷启动(首次运行)时,获取所有秘密并使用它们


让证书;
让寒冷开始=虚假;
exports.handler=异步(事件、上下文)=>{
如果(!coldstart){
凭证=等待获取机密();
coldstart=正确;
}
}
在每次冷启动(首次运行)时,获取所有机密并使用它们


让证书;
让寒冷开始=虚假;
exports.handler=异步(事件、上下文)=>{
如果(!coldstart){
凭证=等待获取机密();
coldstart=正确;
}
}

通常的最佳做法是使用
process.env
,在express应用程序上,您可以使用名为dotenv的库从应用程序根目录上的文本文件或服务器上的其他地方在节点中加载环境。对于lambda,您可以将env变量添加到lambda接口的aws机密管理器中,并通过
process.env
加载。在文件的开头,您还可以加载
const{MYVAR}=process.env
,如果您想缩短时间,通常的最佳做法是使用
process.env
,在express应用程序上,您可以使用名为dotenv的库从应用程序根目录上的文本文件或服务器上的其他地方加载节点中的环境。对于lambda,您可以将env变量添加到lambda接口的aws机密管理器中,并通过
process.env
加载。在文件的开头,您还可以加载
const{MYVAR}=process.env
如果您想缩短,当您说“使用它们”时,您是指@alilland之前的答案吗。您是否建议从coldstart if语句中的(process.env)导出环境变量?因为许多不同的模块都需要我的凭据。或者您是建议我将credentials变量传递到需要它的地方吗?因为我不知道您的代码结构,您可以通过多种方式传递它。我将创建一个单独的模块来处理机密并使用它。你可以加载一次秘密并随时获得秘密服务
const mySecretService=SecretService.get();获取(“secretKey”)我认为我了解TOD,但我一直遇到如何实现此解决方案的问题。例如:我有一个“authController,其中我有一个函数
const signToken=(id)=>{return jwt.sign({id},process.env.jwt_SECRET,{expiresIn:process.env.jwt_EXPIRES_in,});
如何将秘密放入该函数中?每个承诺只能在.then()内调用。我只是不知道如何从“承诺”中取出钥匙。我觉得我需要将我的整个应用程序包装成一个承诺。你能提供进一步的指导吗?当你说“使用它们”时,你指的是@alilland之前的回答。你建议从(process.env)导出环境变量吗在coldstart if语句中?因为我的凭据在许多不同的模块中都需要。或者您是建议我将凭据变量传递到需要的位置?因为我不知道您的代码结构,您可以以多种方式传递它。我将创建一个单独的模块来处理机密并使用它。您可以在您可以随时获取机密服务。
const mySecretService=SecretService.get();mySecretService.get(“secretKey”);
我本以为自己了解这一点,但在如何实现此解决方案方面一直遇到问题。例如:我有一个“authController”,其中包含此函数
const signToken=(id)=>{return jwt.sign({id},process.env.jwt_SECRET,{expiresIn:process.env.jwt_EXPIRES_IN,})};
如何将秘密放入该函数?每个承诺只能在.then()内调用。我只是不知道如何从“承诺”中取出密钥.我觉得我需要把我的整个申请包装成一个承诺。你能提供进一步的指导吗?