调用Cloud Run from Cloud函数:IAM身份验证



我已经通过Google Cloud Run部署了一个小型HTTP端点。当我关闭身份验证时,它工作正常。

我现在想打开它,这样它只能由我的Firebase Cloud函数调用。如果我理解正确,我只需要在Cloud Run的IAM设置中添加正确的服务帐户邮件地址作为";Cloud Run调用程序"。但是哪个地址是正确的呢?

我已经尝试了在Firebase控制台中找到的所有地址->项目设置->服务帐户。

我认为您可以检查特定的firebase函数。在UI中,应列出所使用的服务帐户。

默认情况下,GCF函数都使用<project_id>appspot.gserviceaccount.com

感谢@AhmetB-谷歌和@whlee的回答,我成功了。基本上,在请求中添加一个Authorization Bearer令牌就足够了,您可以从一个特殊的端点获得:https://cloud.google.com/run/docs/authenticating/service-to-service#nodejs

然后,您只需将该功能的服务帐户添加到Cloud Run容器的IAM列表中:<project_id>appspot.gserviceaccount.com

nodejs的例子使用了不推荐使用的请求库,所以这里是我使用axios的版本:

const getOAuthToken = async (receivingServiceURL: string): Promise<string> => {
// Set up metadata server request
const metadataServerTokenURL = 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=';
const uri = metadataServerTokenURL + receivingServiceURL;
const options = {
headers: {
'Metadata-Flavor': 'Google'
}
};
return axios.get(uri, options)
.then((res) => res.data)
.catch((error) => Promise.reject(error));
}

然后您可以在实际请求中使用令牌:

const url = `...`;
const token = await getOAuthToken(url);
axios.post(url, formData, {
headers: {
Authorization: `Bearer ${token}`,
}
}).then(...).catch(...);

@luhu的回答真的很有帮助。我只想为那些愿意首先在本地测试模拟器的人添加一条注释。元数据服务器(现在实际上是http://metadata.google.internal(处于状态

在谷歌云之外不工作,包括在您的本地机器上。

作为一种解决方案,如果您喜欢使用axios,可以使用google-auth-library,然后直接获取令牌。请记住,首先设置指向服务帐户机密的GOOGLE_APPLICATION_CREDENTIALSenv变量,因为这是使其工作的唯一方法(我在admin.initializeApp()期间测试过设置credential字段,但似乎不喜欢它(。

const {GoogleAuth} = require('google-auth-library');
const auth = new GoogleAuth();
const url_origin = '....'
const client = await auth.getIdTokenClient(url_origin);
const token = (await client.getRequestHeaders()).Authorization;
const url = '....'
const response = await axios.get(
url,
{
headers: {
Authorization: token,
},
}
);

相关内容

  • 没有找到相关文章

最新更新