从云端功能调用云端运行:IAM身份验证

时间:2020-07-10 21:17:22

标签: firebase google-cloud-platform google-cloud-functions google-cloud-run google-iam

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

我现在想打开它,以便只能由我的Firebase Cloud Function调用。如果我理解正确,则只需在Cloud Run的IAM设置中将正确的服务帐户邮件地址添加为“ Cloud Run Invoke”。 但是哪个地址是正确的地址?

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

2 个答案:

答案 0 :(得分:4)

我认为您可以检查特定的Firebase功能。在用户界面中,应列出使用的服务帐户。

默认情况下,GCF功能全部使用 @ appspot.gserviceaccount.com

答案 1 :(得分:0)

感谢@AhmetB-Google和@whlee的回答使它正常运行。基本上,向请求添加一个授权承载令牌就足够了,您可以从一个特殊的端点上获得该令牌:https://cloud.google.com/run/docs/authenticating/service-to-service#nodejs

然后,您只需将功能的服务帐户添加到Cloud Run容器的IAM列表中: @ 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(...);