[英]Synchronously load secrets in an HTTP Google Cloud Function (NodeJS)
我有一個提供登錄API端點的Google Cloud Function。 該函數使用私鑰對JWT進行簽名。
現在,在部署功能時,我需要安全地加載用於簽名JWT的私鑰。 我當然不能使用環境變量或將其嵌入代碼的任何部分,因為任何在gcloud中可以讀取該函數的人都可以看到。
我考慮過的選項有:
為該功能創建專用的服務帳戶,以及僅該服務帳戶可以訪問的GCS存儲桶,並在其中以純文本格式存儲密碼。 當函數加載時,加載秘密( await loadMySecrets(...)
)並繼續。
推薦的方法:創建一個KMS密鑰,用該密鑰加密秘密,然后將密文和功能代碼一起上傳。 在運行時,要求KMS解密密鑰( await decryptSecret(...)
)。
問題是:據我所知,當加載HTTP函數時,整個加載過程必須是同步的 。
您的函數返回一個請求處理程序,然后GCF執行該請求處理程序。 返回請求處理程序之前沒有機會await
Promise,並且GCF不支持HTTP函數的返回Promises。 GCS和KMS API是基於Promise的,不支持*Sync()
調用。
其他人如何解決這個問題? 我無法同步等待Promise解決(例如,通過sleep()
),因為那樣會阻塞Node事件循環。 我是否被迫以某種方式同步提供機密,或者是否有一種方法可以使其與GCF完美兼容?
注意:這是普通的Google Cloud Functions, 而不是 Firebase。
注意2:有一個核心選擇,即將異步方面轉移到Express中間件中。 我真的非常不想這樣做,因為我不得不包裝cookie-parser
和passport
類的東西,它們希望在初次創建中間件時可以使用秘密,然后在異步中間件中加載我的秘密然后委托。 丑陋,可能會影響性能。
您可以使整個函數處理程序異步(需要節點8+):
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}`)
}
我看到了您關於中間件的說明。 如果您發布代碼示例,我將嘗試對其進行更新以使其更好地匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.