【问题标题】:Access Google Drive API from a Google Cloud function从 Google Cloud 函数访问 Google Drive API
【发布时间】:2017-09-13 09:00:21
【问题描述】:

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

【问题讨论】:

    标签: google-app-engine google-cloud-platform jwt google-cloud-functions


    【解决方案1】:

    我主要使用 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 将降临在您身上。

    【讨论】:

    • 谢谢!能否请您分享一个在 python 中通过其服务帐户身份获取 drive_service 的后台 CF 示例?
    • 好问题,但与此处的 OP 不同。我现在没有示例,但建议您创建另一个 SO 问题,专门询问您 真正 寻​​求什么,链接到该问题,并添加任何其他详细信息,例如您想调用事件-根据某人更新 Google Drive 上的文件,即 developers.google.com/drive/api/v3/reference/changes/watch 驱动 CF。您听起来好像知道自己在做什么,并且根据我上面的提示加上github.com/googleapis/…,您应该可以自己做
    【解决方案2】:

    默认行为如下:

    在函数执行期间,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多