从Google Cloud功能访问Google Drive API

Ari*_*iel 8 google-app-engine jwt google-cloud-functions

我看到有不同的NodeJS模块使用谷歌API.访问与Google Cloud功能的服务帐户共享的文件的最佳做法是什么?

wes*_*cpy 5

我主要使用 Python 进行开发,但它与您提到的 Node 有类似的问题:有很多库和太多不同的代码示例。另一个问题是访问 G Suite API(如 Drive)与 GCP API 不同。(免责声明:我在 Google 工作并试图改善这种差异。)

服务帐户身份是从 GCF访问Drive API的最佳方式。但是,您可以选择 Cloud Functions 的默认服务帐户身份(与 App Engine 应用程序相同),或者作为此处建议的另一个答案,改为用户管理的服务帐户。如果您计划拥有多个身份来做不同的事情,需要不同类型的访问等,后者是一个好主意,否则使用默认值更容易,因为除了创建之外,您实际上不需要做任何其他事情该帐户的私钥对。

一旦您决定了哪种类型的服务帐户,最好使用Node.jsGoogle API 客户端库与 Drive、G Suite 和其他非 GCP Google API 通信。按照Drive API Node.js 快速入门教程学习如何“使用它”。由于 Drive 文件通常属于用户帐户而不是服务帐户,因此快速入门中的身份验证示例使用OAuth 客户端 ID(用户帐户)身份验证而不是服务帐户身份验证来提示用户(云端硬盘所有者)授予应用访问其数据的权限,所以不要只是剪切粘贴!

(如果您不使用 Cloud Functions,您可能正在使用 Web 应用程序或 cmd 行工具。在这种情况下,如果选择用户帐户身份验证而不是服务帐户身份验证,最终用户 [驱动器文件所有者] 必须明确授予通过熟悉的OAuth 同意对话框允许您的代码访问他们的文件。作为开发人员,您需要事先在 Cloud Console设置 OAuth 同意屏幕。注意:该屏幕截图来自我的G Suite API 介绍教程[Python ])。

从示例中复制必要的样板并将用户 acct auth 替换为服务帐户 auth。有关如何执行此操作,请参阅Node.js 客户端库文档的服务帐户部分。不要忘记为您决定从服务帐户页面使用的任何服务帐户及其应具有的任何角色/权限创建私钥对。创建密钥文件后,它会提示您下载密钥文件,然后使用您的函数上传该文件(除非您按照另一个答案中的建议使用 Secret Manager)。通过使用客户端库,您可以避免在请求标头中粘贴内容(也如另一个答案中所建议的那样)。然而,如果那是 CI/CD 周期的一部分,则在任何情况下都不应该将该密钥文件检查到 Git 中;如果你的私钥被公开泄露/暴露...... DOOM 将降临你。


Joe*_*ook 2

默认行为如下:

在函数执行期间,Cloud Functions 使用服务帐户PROJECT_ID@appspot.gserviceaccount.com作为其身份。例如,当使用 Google Cloud 客户端库向 Google Cloud Platform 服务发出请求时,Cloud Functions 可以自动获取并使用令牌来授权该身份有权使用的服务。

更多信息请参见此处


个人建议:使用特定用途的服务帐户是一种很好的做法,您需要安全地存储该帐户而不是将其推送到版本控制中 - 这意味着您可以下载它并将其包含在gcloud functions deploy脚本中(这样就可以读取它) nodeJS 运行时以及your package.json实际的函数文件)——但始终将其 git 忽略。

如果您想要超级安全,您可以将此方法与另一个名为Secret Manager的谷歌云产品结合起来。其 NodeJS 实现在这里。但这样做的缺点是函数启动和加密 JSON 解密之间的时间较长(因为它本身就是网络操作)。


还有一件更重要的事情需要知道——驱动器 API 令牌——已经在这里回答: https: //stackoverflow.com/a/58842310/8160318