从 Google Cloud 功能访问 Google Drive API

问题描述 投票:0回答:2

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

google-app-engine google-cloud-platform jwt google-cloud-functions
2个回答
14
投票

我主要使用Python进行开发,但它与您提到的Node有类似的问题:大量的库和太多不同的代码示例。另一个问题是访问 Google Workspace(GWS;以前的 G Suite API [如 Drive])与 GCP API 非常不同。

服务帐户身份是从 GCF 访问 Drive API 的最佳方式。但是,您可以选择 Cloud Function 的“默认服务帐户”身份(与 App Engine 应用程序相同),或者如此处建议的另一个答案所示,选择“用户管理的服务帐户”。如果您计划拥有多个身份来执行不同的操作、需要不同类型的访问权限等,则后者是一个好主意,否则使用默认值会更容易,因为除了创建之外,您实际上不需要执行任何其他操作该帐户的私钥对。 一旦您决定了服务帐户类型,最好使用 适用于 Node.js 的 Google API 客户端库 与云端硬盘、G Suite 和其他

非 GCP

Google API 进行交互。按照 Drive API Node.js 快速入门教程 学习如何“使用它”。由于云端硬盘文件通常属于 用户帐户而不是 服务帐户,因此快速入门中的身份验证示例采用 OAuth 客户端 ID(用户帐户)身份验证而不是 服务帐户身份验证,以提示用户(云端硬盘所有者)授予应用程序访问其数据的权限,所以不要只是剪切粘贴! 如果您使用Cloud Functions(或任何GCP产品),则您可能正在使用Web应用程序或命令行工具。在这种情况下,您应该选择用户身份验证(OAuth 客户端 ID)而不是服务帐户身份验证,以便您网站上的最终用户或运行命令行工具的[驱动器文件所有者]

明确

通过熟悉的 OAuth 同意对话框,用于 您的 代码访问 他们的 文件。作为开发者,您需要事先在 Cloud Console 中设置 OAuth 同意屏幕。注意:该屏幕截图取自我的 Workspace API 介绍教程 [Python]。 从示例中复制必要的样板,并将用户帐户身份验证替换为服务帐户身份验证。有关如何执行此操作的信息,请参阅 Node.js 客户端库的 服务帐户部分 文档。不要忘记为您决定从服务帐户页面使用的任何服务帐户及其应具有的任何角色/权限创建私钥对。创建密钥文件后,它会提示您下载密钥文件,然后使用您的函数上传该文件(除非您按照另一个答案中的建议使用 Secret Manager)。通过使用客户端库,您可以避免将内容粘贴在请求标头中(也如另一个答案中所建议的那样)。

但是

,如果这是 CI/CD 周期的一部分,则在任何情况下都不应该将该密钥文件签入 Git;如果您的私钥被泄露/公开暴露...厄运将降临到您身上。 默认行为如下:

在函数执行期间,Cloud Functions 使用服务帐户

2
投票
作为其身份。例如,当使用 Google Cloud 客户端库向 Google Cloud Platform 服务发出请求时,Cloud Functions 可以自动获取并使用令牌来授权该身份有权使用的服务。

更多信息

这里

个人建议:使用

特定用途的服务帐户是一个很好的做法,您需要安全地存储该帐户而不是推送到版本控制中——这意味着您可以下载它并将其包含在您的gcloud functions deploy

脚本中(因此它NodeJS 运行时可以与
your package.json

和实际函数文件一起读取)——但始终将其 git-ignored。 如果您想要超级安全,您可以将此方法与另一个名为

Secret Manager
的谷歌云产品结合起来。其 NodeJS 实现是
here
。但这样做的缺点是函数启动和加密 JSON 解密之间的时间较长(因为它本身就是网络操作。)

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


© www.soinside.com 2019 - 2024. All rights reserved.