如何从外部Node.js服务器认证调用Google Cloud函数及方案更新
外部Node.js服务器调用安全Google Cloud HTTP函数的认证方案
获取认证令牌
- 创建并下载服务账号密钥:在GCP控制台的IAM与管理>服务账号页面,创建一个拥有
roles/cloudfunctions.invoker角色的服务账号(确保该账号有权调用目标云函数),下载JSON格式的密钥文件到本地服务器。 - 使用Google Auth库生成ID令牌:在外部Node.js项目中安装
google-auth-library依赖,通过服务账号密钥生成针对目标云函数URL的专属ID令牌。
示例代码:
const { GoogleAuth } = require('google-auth-library'); const auth = new GoogleAuth({ keyFilename: '/path/to/your-service-account-key.json', scopes: 'https://www.googleapis.com/auth/cloud-platform' }); async function getAuthToken(functionUrl) { const client = await auth.getIdTokenClient(functionUrl); const res = await client.request({ url: functionUrl }); return res.config.headers['Authorization']; }
调用安全云函数
拿到令牌后,在请求的Authorization头中携带Bearer ${token}即可发起安全调用:
const axios = require('axios'); async function callCloudFunction(functionUrl) { const authToken = await getAuthToken(functionUrl); const response = await axios.post(functionUrl, { /* 自定义请求体数据 */ }, { headers: { 'Authorization': authToken } }); console.log(response.data); } callCloudFunction('https://REGION-PROJECT_ID.cloudfunctions.net/YOUR_FUNCTION_NAME');
切换到Pub/Sub事件触发后的认证注意事项
既然你已切换到Pub/Sub触发的云函数并使用服务账号认证,以下是几个关键优化点:
- 服务账号权限配置:确保用于发送消息的服务账号拥有
pubsub.publisher角色,否则无法向目标主题推送消息。 - 利用客户端库自动认证:使用
@google-cloud/pubsub客户端库发送消息时,无需手动生成令牌,库会自动读取服务账号密钥完成认证流程。
示例代码:
const { PubSub } = require('@google-cloud/pubsub'); const pubsub = new PubSub({ keyFilename: '/path/to/your-service-account-key.json' }); async function publishMessage(topicName, data) { const topic = pubsub.topic(topicName); const dataBuffer = Buffer.from(JSON.stringify(data)); const messageId = await topic.publishMessage({ data: dataBuffer }); console.log(`消息已发布,ID: ${messageId}`); } publishMessage('YOUR_TOPIC_NAME', { key: 'value' });
- 云函数侧权限:确保云函数关联的服务账号拥有
pubsub.subscriber角色,这样才能接收Pub/Sub主题的消息并触发执行。
内容的提问来源于stack exchange,提问作者Alish Satani
相关产品推荐
相关产品推荐

