Node.js 在HTTP Google云函数(NodeJS)中同步加载机密

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密钥,用该密

我有一个GoogleCloud函数,它提供了一个登录API端点。该函数使用私钥对JWT进行签名

现在,在部署函数时,我需要安全地加载用于签署JWT的私钥。当然,我不能使用环境变量或将其嵌入代码的任何部分,因为任何可以在gcloud中读取函数的人都可以看到环境变量

我考虑过的选项有:

  • 为该功能创建一个专用的服务帐户,外加一个只有该服务帐户才能访问的GCS存储桶,并将秘密以明文形式存储在其中。加载函数时,加载机密(
    等待loadMySecrets(…)
    )并继续

  • 建议的方法是:创建一个KMS密钥,用该密钥加密机密,并将密文与功能代码一起上传。在运行时,要求KMS解密密钥(
    wait decryptSecret(…)

  • 问题是:据我所知,当加载HTTP函数时,整个加载过程必须是同步的

    您的函数返回一个请求处理程序,然后GCF执行它。在返回请求处理程序之前,没有机会等待承诺,GCF不支持HTTP函数的返回承诺。GCS和KMS API基于承诺,不支持
    *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}`)
    }