我有一个提供登录 API 端点的谷歌云函数。该函数使用私钥对 JWT 进行签名。
现在,在部署该功能时,我需要安全地加载用于签署 JWT 的私钥。当然,我不能使用环境变量或将其嵌入代码的任何部分,因为任何可以在 gcloud 中读取函数的人都可以看到。
我考虑过的选项是:
为该函数创建一个专用服务帐户,以及一个只有该服务帐户可以访问的 GCS 存储桶,并将密钥以纯文本形式存储在其中。当函数加载时,加载秘密(
await loadMySecrets(...)
)并继续。推荐的方法:创建一个KMS密钥,用该密钥加密秘密,然后将密文与功能码一起上传。在运行时,要求 KMS 解密密钥 (
await decryptSecret(...)
)。
问题是:据我所知,当一个 HTTP 函数被加载时,整个加载过程必须是同步的。
您的函数返回一个请求处理程序,然后 GCF 执行它。在您返回请求处理程序之前没有机会await
返回 Promise,并且 GCF 不支持 HTTP 函数的返回 Promise。GCS 和 KMS API 是基于 Promise 的,不*Sync()
支持调用。
其他人是如何解决这个问题的?我无法同步等待我的 Promise 解决(例如 via sleep()
),因为这会阻塞 Node 事件循环。我是否被迫以某种方式同步提供秘密,或者有没有一种方法可以异步执行它与 GCF 配合得很好?
注意:这是普通的 Google Cloud Functions,而不是Firebase。
注 2:有一个核选项,即将异步方面移到 Express 中间件中。我真的,真的不想这样做,因为我必须包装诸如cookie-parser
and之类的东西passport
,它期望在第一次创建中间件时秘密可用,在异步中间件中加载我的秘密然后委托。丑陋,可能会影响性能。