如何在Firebase Cloud Function的Next.js中调用GCP密钥管理器密钥
从GCP密钥管理器获取密码替换Firebase Cloud Function中的硬编码值
步骤1:给Cloud Function服务账号添加密钥访问权限
Firebase Cloud Function默认使用[你的项目ID]@appspot.gserviceaccount.com服务账号运行,需为其授予Secret Manager Secret Accessor角色:
- 打开GCP控制台IAM页面,找到该服务账号
- 点击"编辑",添加角色时搜索并选择
Secret Manager Secret Accessor - 保存更改
步骤2:安装GCP密钥管理器客户端库
在你的Cloud Function项目目录下执行:
npm install @google-cloud/secret-manager
步骤3:修改代码从密钥管理器获取密码
替换硬编码密码逻辑,改为异步获取密钥:
const nodemailer = require('nodemailer'); const smtpTransport = require('nodemailer-smtp-transport'); const { SecretManagerServiceClient } = require('@google-cloud/secret-manager'); // 初始化密钥管理器客户端 const secretManagerClient = new SecretManagerServiceClient(); // 异步获取Gmail应用密码 async function getGmailAppPassword() { // 自动获取当前项目ID,无需硬编码 const projectId = process.env.GCP_PROJECT; // 替换为你在密钥管理器中创建的密钥名称 const secretPath = `projects/${projectId}/secrets/你的密钥名称/versions/latest`; const [version] = await secretManagerClient.accessSecretVersion({ name: secretPath }); return version.payload.data.toString(); } // 示例:HTTP触发的邮件发送函数 exports.sendEmail = async (req, res) => { try { // 获取密码 const gmailPassword = await getGmailAppPassword(); // 创建邮件传输器 const transporter = nodemailer.createTransport( smtpTransport({ service: 'gmail', auth: { user: 'camilo@camiloengineer.com', pass: gmailPassword }, }) ); // 发送邮件(可根据实际需求调整参数来源) await transporter.sendMail({ from: 'camilo@camiloengineer.com', to: req.body.to, subject: req.body.subject, text: req.body.content }); res.status(200).send('邮件发送成功'); } catch (err) { console.error('邮件发送失败:', err); res.status(500).send('邮件发送失败'); } };
注意事项
- 替换代码中的
你的密钥名称为GCP密钥管理器中对应密钥的实际名称 - 本地开发时需设置
GOOGLE_APPLICATION_CREDENTIALS环境变量,指向你的GCP服务账号密钥文件(部署到Firebase后无需此操作) - 确保密钥管理器中的密钥版本处于"启用"状态
内容的提问来源于stack exchange,提问作者Camilo Engineer
相关产品推荐
相关产品推荐

