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

nat*_*evw 7 authentication node.js google-cloud-functions

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

对于本地开发,我通过其开发人员控制台的" 服务帐户"部分添加了一个帐户 我下载了令牌文件(下面的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})
  });
};
Run Code Online (Sandbox Code Playgroud)

用我的服务帐户的"电子邮件地址"分享我的电子表格后,例如local-devserver@foobar-bazbuzz-123456.iam.gserviceaccount.com- 它有效!

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

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

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

Dou*_*son 4

将凭证与功能部署捆绑在一起是很常见的。只是不要将它们签入源代码管理中。 Cloud Functions for Firebase 示例可在需要时执行此操作。例如,从 Cloud Storage 创建签名 URL 需要管理员凭据,此示例演示了将该凭据保存到要使用函数部署的文件中。