【问题标题】:How do I authenticate using a service account in the Google Cloud Platform REST API如何在 Google Cloud Platform REST API 中使用服务帐号进行身份验证
【发布时间】:2020-09-20 04:49:07
【问题描述】:

我想使用服务帐户密钥对 Google Cloud Platform 进行 REST API 调用,但我不知道如何对调用进行身份验证。通常,我会使用提供的客户端库并将密钥传递给它,但在这种情况下,客户端库不支持此特定端点。

这是我试图调用的其余端点: https://cloud.google.com/datastore/docs/reference/admin/rest/v1/projects/export

我需要从 nodejs 应用程序进行调用,所以这是相应的客户端库: https://github.com/googleapis/nodejs-datastore

The documentation 非常注重一般概念,但我找不到任何关于如何使用正确凭据实际进行 REST 调用的具体内容。

【问题讨论】:

  • 我写了一篇文章,展示了Python中的步骤:jhanley.com/…
  • 另一个想法可能是使用适用于 JavaScript 的通用 Google API 客户端库。据我了解...在松散的级别...对于此处列出的所有 API ...developers.google.com/apis-explorer/#p 包括 cloud.google.com/datastore/docs/reference/admin/rest 有一个 JavaScript 高级 API 提供身份验证和调用功能。
  • @JohnHanley 太棒了!我将把它移植到 nodejs 并现在试一试。如果我可以问,你是怎么知道怎么做的?是否有我不知道的文档,或者是从对 OAuth 和反复试验的一般理解得出的?
  • @Kolban 我不知道 JS 客户端。感谢您指出。不过,它似乎是为客户端设计的,以及相应的身份验证流程,所以我认为我不能在服务器端使用它。
  • @bluethings - 我通过研究 Google Cloud 客户端库源代码创建了我的文章。我看到您使用其中一个客户端库发布了答案。如果你搜索我的答案,你会看到我用 node.js 和其他语言编写的其他客户端示例。

标签: google-cloud-platform google-cloud-datastore


【解决方案1】:

我发现 Google 有用于 nodejs 的库 google-auth-library,它在内部处理所需的 OAuth 流。我能够使用它成功地进行经过身份验证的调用。

这是代码:

const auth = await new GoogleAuth({
    keyFilename: pathToKey,
    scopes: 'https://www.googleapis.com/auth/cloud-platform',
}).getClient()

const result = await auth.request({
    url: `https://datastore.googleapis.com/v1/projects/${projectId}:export`,
    method: 'POST',
    body: JSON.stringify(payload),
})

注意,这处理了身份验证部分。我仍然必须向服务帐户授予正确的权限才能使授权部分正常工作。

编辑

显然还有一个googleapis nodejs 库,它为整个 REST API 提供了一个瘦包装器。我更喜欢直接进行其余调用,因为该库具有 Typescript 类型,可检查有效负载是否具有正确的形状等,而且我不必手动指定 URL。您仍然需要google-auth-library 来处理身份验证。

import {google as googleapis} from 'googleapis'

const auth = await new GoogleAuth({
    keyFilename: pathToKey,
    scopes: 'https://www.googleapis.com/auth/cloud-platform',
}).getClient()

const datastore = googleapis.datastore('v1')
await datastore.projects.export({
    auth,
    projectId: theProjectid,
    requestBody: payload,
})

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 2018-05-02
    • 2017-11-03
    • 2018-11-25
    • 1970-01-01
    • 2019-11-06
    • 2019-11-05
    • 2013-09-23
    相关资源
    最近更新 更多