【发布时间】:2017-09-13 09:00:21
【问题描述】:
我看到有不同的 NodeJS 模块使用 Google API。 访问与 Google Cloud 功能的服务帐号共享的文件的最佳做法是什么?
【问题讨论】:
标签: google-app-engine google-cloud-platform jwt google-cloud-functions
我看到有不同的 NodeJS 模块使用 Google API。 访问与 Google Cloud 功能的服务帐号共享的文件的最佳做法是什么?
【问题讨论】:
标签: google-app-engine google-cloud-platform jwt google-cloud-functions
我主要使用 Python 进行开发,但它存在与您提到的 Node 类似的问题:大量库和太多不同的代码示例。另一个问题是访问 G Suite API(如 Drive)与 GCP API 不同。 (披露:我在 Google 工作,正在努力改善这种差异。)
服务帐户身份是从 GCF 访问 Drive API 的最佳方式。但是,您可以选择 Cloud Function 的 default service account 身份(与 App Engine 应用程序相同),或者作为此处建议的另一个答案,改为 user-managed service account。如果您计划拥有多个身份来执行不同的操作、需要不同类型的访问权限等,则后者是一个好主意,否则使用默认值会更容易,因为除了创建之外您实际上不需要做任何其他事情该帐户的私钥对。
确定服务帐户类型后,最好使用Google APIs Client Library for Node.js 与云端硬盘、G Suite 和其他非 GCP Google API 通信。关注Drive API Node.js quickstart tutorial 了解如何“工作”。由于云端硬盘文件通常属于用户帐户而不是服务帐户,因此快速入门中的身份验证示例使用OAuth client ID (user account) auth 而不是service account auth 来提示用户(云端硬盘所有者)授予应用访问其数据的权限,所以不要只是剪切粘贴!
(如果您不使用 Cloud Functions,您可能正在使用 Web 应用程序或命令行工具。在 那种情况下,如果选择 user acct auth 而不是 service acct auth,则结束-users [Drive file owner] 必须明确通过熟悉的OAuth consent dialog 授予您的代码访问他们的文件的权限。作为开发人员,您需要事先setup that OAuth consent screen in the Cloud Console。注意:该屏幕截图取自我的G Suite APIs intro tutorial [Python])。
从示例中复制必要的样板文件并将用户 acct auth 替换为服务帐户身份验证。请参阅service account section of the Node.js client library 文档了解如何操作。不要忘记为您决定从Service accounts page 使用的任何服务帐户以及它应该拥有的任何角色/权限创建一个私钥对。创建密钥文件后,它会提示您下载密钥文件,然后使用您的函数上传该文件(除非您按照另一个答案中的建议使用 Secret Manager)。通过使用客户端库,您可以避免将内容粘贴在请求标头中(也如另一个答案中所建议的那样)。 但是,如果这是 CI/CD 周期的一部分,则在任何情况下都不应将该密钥文件签入 Git;如果您的私钥被泄露/公开... DOOM 将降临在您身上。
【讨论】:
默认行为如下:
在函数执行期间,Cloud Functions 使用服务帐户
PROJECT_ID@appspot.gserviceaccount.com作为其身份。例如,当使用 Google Cloud 客户端库向 Google Cloud Platform 服务发出请求时,Cloud Functions 可以自动获取并使用令牌来授权此身份有权使用的服务。
更多信息here。
个人建议:使用purpose-specific service account 是一种很好的做法,您需要安全地存储它而不是推送到您的版本控制中——这意味着您可以下载它并将其包含在您的gcloud functions deploy 脚本中(所以它会与your package.json 和实际函数文件一起对nodeJS 运行时可读)——但总是让它被git-ignored。
如果您想要超级安全,可以将此方法与另一个名为 Secret Manager 的谷歌云产品结合使用。其中的 nodeJS 实现是here。但是,这样做的缺点是函数启动和解密加密 JSON 之间的时间量(因为它本身就是网络操作。)
还有一件更重要的事情要知道——驱动 API 令牌——已经在这里回答了:https://stackoverflow.com/a/58842310/8160318。
【讨论】: