繁体   English   中英

将Google Cloud功能验证为其他Google API上的服务帐户

[英]Authenticating a Google Cloud Function as a service account on other Google APIs

我有一个在Google Cloud Functions上运行的HTTP触发功能,它使用require('googleapis').sheets('v4')将数据写入docs电子表格。

对于本地开发,我通过其开发人员控制台的“ 服务帐户”部分添加了一个帐户 我下载了令牌文件(下面的dev-key.json)并用它来验证我对Sheets API的请求,如下所示:

var API_ACCT = require("./dev-key.json");
let apiClient = new google.auth.JWT(
  API_ACCT.client_email, null, API_ACCT.private_key,
  ['https://www.googleapis.com/auth/spreadsheets']
);

exports.myFunc = function (req, res) {
  var newRows = extract_rows_from_my_client_app_request(req);
  sheets.spreadsheets.values.append({
    auth: apiClient,
    // ...
    resource: { values:newRows }
  }, function (e) {
    if (e) res.status(500).json({err:"Sheets API is unhappy"});
    else res.status(201).json({ok:true})
  });
};

在我与我的服务帐户的“电子邮件地址”共享我的电子表格后,例如local-devserver@foobar-bazbuzz-123456.iam.gserviceaccount.com - 它工作了!

但是,当我将其部署到Google Cloud Functions服务时,我想知道是否有更好的方法来处理凭据? 我的代码可以自动验证自身,而无需将JWT密钥文件与部署捆绑在一起吗?

我注意到我的函数运行时设置了一个FUNCTION_IDENTITY=foobar-bazbuzz-123456@appspot.gserviceaccount.com环境变量,但我不知道如何在我的googleapis调用的auth值中使用它。 google.auth.getApplicationDefault代码不使用它。

将私有JWT令牌与我的GCF代码一起上传是否可行? 或者我应该以某种方式使用元数据服务器 或者云端功能是否已经可以通过内置方式对其他Google API进行身份验证?

将凭证与功能部署捆绑在一起很常见。 只是不要将它们检查到源代码管理中。 Firebase示例的云功能可在需要时执行此操作。 例如,从云存储创建签名URL需要管理员凭据, 此示例说明将该凭据保存到要与这些功能一起部署的文件中。

我想知道是否有更好的方法来处理凭据? 我的代码可以自动验证自身,而无需将JWT密钥文件与部署捆绑在一起吗?

是。 您可以使用“ 应用程序默认凭据 ”,而不是您如何使用它,但是您不使用函数getApplicationDefault(),因为自Q发布以来已弃用。

上面的链接显示了如何使用google.auth.getClient API进行简单调用,提供所需的范围,并让它自动决定所需的凭据类型。 在云函数上,这将是一个“计算”对象,如google-auth-library中所定义。

这些文档在这里说得好......

设置服务帐户后,ADC可以隐式查找您的凭据,而无需更改您的代码,如上一节所述。

ADC是应用程序默认凭据。

请注意,对于云功能,您可以使用App Engine服务帐户:YOUR_PROJECT_ID@appspot.gserviceaccount.com,如此处所述 那是你通过FUNCTION_IDENTITY env var找到的那个 - 这让我大吃一惊。

最后一步是确保服务帐户具有您对电子表格所需的访问权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM