应用默认凭据http从本地nodejs应用触发GCP功能



我想从本地运行的简单nodejs应用程序触发GCP云功能。

阅读文档应该很简单:

  1. 运行gcloud auth application-default login将ADC写入客户端库使用的文件
  2. 使用google-auth-library获取一个http客户端来触发该函数。
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// Example: https://my-cloud-run-service.run.app/books/delete/12345
// const url = 'https://TARGET_HOSTNAME/TARGET_URL';
// Example (Cloud Functions): https://project-region-projectid.cloudfunctions.net/myFunction
const targetAudience = 'https://<REGION>-<PROJECTID>.cloudfunctions.net/<FUNCTIONNAME>';
const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();
const payload = {"prop1": "prop1Value"};
async function request() {
const client = await auth.getIdTokenClient(targetAudience);
const resp = await client.request({ url: targetAudience, method: 'POST', data: payload });
console.info(`Resp status: ${resp.status}; resp.data: ${resp.data}`);
}
(async () => {
await request();
})();
我的理解是google-auth-library将从运行gcloud auth application-default login的文件设置中拾取ADC,一切都将正常工作。我的用户有权限调用GCP函数,因为我可以使用标题为-H "Authorization:bearer $(gcloud auth print-identity-token)"

的CURL触发该函数然而,当我运行这个时,它没有超过这行:

const client = await auth.getIdTokenClient(targetAudience);

失败:

无法在此环境中获取ID令牌,请使用GCE或设置GOOGLE_APPLICATION_CREDENTIALS环境变量to一个服务帐户凭据JSON文件。

使用PubSub库工作得很好,所以期望ADC确实工作,只是不确定我在试图触发GCP函数时错过了什么。我是否在使用google-auth-library这里正确吗?

感谢

当然,有一些方法可以解决您的问题,但从根本上说,这个库似乎缺少对本地application-default凭据的支持——这是许多其他google库支持的一个开箱即用的特性。在本地要求服务帐户JSON文件是一种较旧的方法。

这看起来像一个错误或至少缺少功能,我在客户端库中提出了一个问题:https://github.com/googleapis/google-auth-library-nodejs/issues/1543

没有此支持的本地开发意味着所有开发人员需要导出特权服务帐户JSON密钥,将其存储在本地,并配置环境变量。GCS、秘密管理器等等都是"开箱即用"的。如果使用gcloud auth application-default login,则使用本地认证的application-default凭据。为了一个库,把这个负担(以及JSON键的潜在安全问题)强加给我们的本地开发人员是很可惜的,所以希望这个问题能得到关注。

正如在线程中提到的:

gcloud auth activate-service-account——key-file仅用于"您";运行gcloud命令,它不会被"应用程序"拾取。那需要GOOGLE_APPLICATION_CREDENTIALS。从Invoke中可以看到谷歌云运行从java或如何从外部调用云运行云运行/GCP?的JSON密钥文件服务帐户,或者必须在GCE/GKE/Cloud Run/App中运行发动机/GCF实例。

要在您的本地环境中工作,我建议登录使用gcloud auth application-default登录命令(该命令为意味着工作,如果你已经设置GOOGLE_APPLICATION_CREDENTIALS本地)。

如果这不起作用,作为最后的手段,您可以将代码重构为从环境变量(如果设置了)中获取标识令牌在本地工作,

如:$ export ID_TOKEN="$(gcloud auth print-identity-token -q)" $ ./your-app

要了解更多关于代码如何使用JSON密钥文件的信息,请参考链接和类似的实现。要了解更多信息,您可以参考类似的线程:

  • 赋予默认的服务帐户对Workspace的访问权限您试图访问的资源。

  • 使用您设置的JSON密钥文件已经在本地启动,以使云功能以相同的用户运行

    在本地运行时发生。
  • 本质上是做一个混合的,你创建一个新的服务帐户,只有你想要的权限(而不是使用默认的
    服务帐户或你的个人用户,这两个可能有远
    更多的权限比所需的安全/安全),使用一个密钥文件在该身份下运行云功能,并只提供所需的功能该服务帐户的权限。

最新更新