Node.js 在HTTP Google云函数(NodeJS)中同步加载机密
我有一个GoogleCloud函数,它提供了一个登录API端点。该函数使用私钥对JWT进行签名 现在,在部署函数时,我需要安全地加载用于签署JWT的私钥。当然,我不能使用环境变量或将其嵌入代码的任何部分,因为任何可以在gcloud中读取函数的人都可以看到环境变量 我考虑过的选项有:Node.js 在HTTP Google云函数(NodeJS)中同步加载机密,node.js,google-cloud-functions,google-cloud-storage,google-cloud-kms,Node.js,Google Cloud Functions,Google Cloud Storage,Google Cloud Kms,我有一个GoogleCloud函数,它提供了一个登录API端点。该函数使用私钥对JWT进行签名 现在,在部署函数时,我需要安全地加载用于签署JWT的私钥。当然,我不能使用环境变量或将其嵌入代码的任何部分,因为任何可以在gcloud中读取函数的人都可以看到环境变量 我考虑过的选项有: 为该功能创建一个专用的服务帐户,外加一个只有该服务帐户才能访问的GCS存储桶,并将秘密以明文形式存储在其中。加载函数时,加载机密(等待loadMySecrets(…))并继续 建议的方法是:创建一个KMS密钥,用该密
等待loadMySecrets(…)
)并继续wait decryptSecret(…)
)*Sync()
调用
其他人是如何解决这个问题的?我不能同步等待我的承诺来解决(例如通过sleep()
),因为这将阻止节点事件循环。我是被迫以某种方式同步提供机密,还是有一种方法可以异步提供机密,从而更好地使用GCF
注意:这是普通的谷歌云功能,不是Firebase
注2:有一个核心选项,即将其异步方面移动到Express中间件中。我真的,真的不想这样做,因为我必须将
cookie解析器
和passport
之类的东西包装在异步中间件中,异步中间件加载我的机密,然后委托。丑陋且可能影响性能。您可以使整个函数处理程序异步(需要节点8+):
我看到了你关于中间件的说明。如果您发布了一个代码示例,我将尝试更新它以更好地匹配 为什么不能作为函数调用的一部分加载凭据?您甚至可以将其存储在一个全局中,以便下一次调用恰好命中同一实例。node/JavaScript中不应该有任何东西是同步的,我想你的建议是我的注释2——将cred作为HTTP调用的一部分加载。我可以这样做,但正如我上面所说的,这意味着在异步委托中间件中包装Express middlware初始化,这是同步的。这会让代码变得凌乱。你真的需要中间件来完成吗?它可能只是在请求处理程序中吗?中间件层是使用机密的地方,所以是的
const decrypt = async (ciphertext) => {
result = await client.decrypt({
name: cryptoKeyID,
ciphertext: ciphertext,
});
return result.plaintext;
}
exports.F = async (req, res) => {
const username = await decrypt(process.env.DB_USER);
const password = await decrypt(process.env.DB_PASS);
res.send(`${username}:${password}`)
}