【问题标题】:Create Google Cloud Project with Cloud Resource Manager API使用 Cloud Resource Manager API 创建 Google Cloud 项目
【发布时间】:2017-02-09 13:51:49
【问题描述】:

我正在尝试使用Cloud Resource Manager API 在 Google Cloud Platform 中创建一个新项目。 当我通过 API Explorer 使用它时一切正常,但是我不太明白如何在 API Explorer 之外将它用作 http 请求。

我这样运行请求:

curl -H "Content-Type: application/json" -X POST -d '{"name": "project example","projectId": "my-project-example-1234"}' https://cloudresourcemanager.googleapis.com/v1/projects?fields=response&key={MY_APY_KEY}

回复:

{
  "error": {
    "code": 401,
    "message": "The request does not have valid authentication credentials.",
    "status": "UNAUTHENTICATED"
  }
}

文档说这个请求是requires an OAuth scope,这让我感到困惑。 阅读文档时,我无法理解在向其余 API 发出 http 请求时如何通过 URL 传递所需的 OAuth 范围之一,我只是假设这是我所缺少的。

【问题讨论】:

  • 在 OAuth 身份验证期间传递范围,而不是随后使用凭据:cloud.google.com/docs/authentication#oauth_scopescloud.google.com/resource-manager/docs/authorizing
  • 我假设 curl 请求只是为了测试:你想使用什么目标语言?您是打算代表最终用户创建项目,还是希望以自己的帐户作为所有者来创建项目?
  • @BrettJ。你明白了。我正在使用 Go,我会代表我的最终用户创建项目,而不是像我可以在此处找到的所有示例那样的默认帐户。
  • Go 不是我的强项,但发布了一个答案,其中包含一个示例项目的交叉链接,可能会让你走得更远。

标签: google-app-engine google-api google-oauth google-cloud-platform


【解决方案1】:

我将尝试更广泛地回答您的目标,而不只是告诉您如何使用有效的令牌进行测试。

在相当高的水平上,您需要:

  1. Enable the Resource Manager API 用于您的 Cloud Console 项目。

  2. Create an OAuth client ID for Web applications 在 Cloud Console 中。您将需要注册您的授权重定向 URI。当最终用户授权您的应用程序时,您的应用程序将从 Google 返回 OAuth 响应。记下客户端 ID,接下来您将需要它。

  3. 通过组合您的 URL 来启动 OAuth 流程:

    https://accounts.google.com/o/oauth2/v2/auth?
    response_type=code&
    client_id=<123456789example>.apps.googleusercontent.com&
    scope=https://www.googleapis.com/auth/cloudplatformprojects&
    redirect_uri=http://<YOUR-APP-URL>/<YOUR-OAUTH-HANDLER>
    

    在该 URL 中替换客户端 ID 和重定向 URI。我假设您的网站上有一个按钮或链接,您可以让用户单击以启动此流程。

  4. 编码您的 OAuth 处理程序。可以从 this Go Sample 收集在 Go 中执行此操作的一些更深入的代码,该代码最初用于 G+ 登录,但大部分逻辑将是相同的。您将获得一个传递给您的应用程序的 code 查询参数,该值是一个一次性授权代码,您的应用程序必须用它来交换您用来代表用户进行 API 调用的 OAuth 令牌。

  5. 如果适合您的应用和情况,请安全地存储您的令牌以供以后使用或在您的用户未在您的网站上活动时进行处理(可能适合批处理)。

  6. 现在您有了访问令牌,您可以将其传递给资源管理器 API 并代表用户创建项目。您可以使用 Go client library 或者直接在代码中调用 HTTP 端点。

如果您想使用 curl 进行更多测试,我会按照我们在 accessing the App Engine Admin API 中编写的流程进行操作。将 Admin API URL 和名称替换为 Resource Manager,您就得到了整个流程。与上述不同的是,我在上面使用了code 流程,因为我假设您需要服务器端并可能刷新令牌,如果您需要能够在用户在您的网站上不活动时进行这些 API 调用。

【讨论】:

【解决方案2】:

就像 Alex 所说,您在 OAuth 身份验证期间要求提供范围。一种轻松验证和获取 Oauth 访问令牌的方法是:

gcloud beta auth application-default login --scopes=https://www.googleapis.com/auth/cloudplatformprojects

如您所见,您可以指定 gcloud 的范围,它会为您处理身份验证。

然后,您应该可以创建一个项目调用:

curl -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud beta auth application-default print-access-token)" -X POST -d '{"name": "项目示例","projectId": "my-project-example-1234"}' https://cloudresourcemanager.googleapis.com/v1/projects?fields=response

在这里,您正在传递进行 Oauth 身份验证时获得的访问令牌。当您获取应用程序默认凭据时,客户端库应为您处理此问题。

【讨论】:

  • 谢谢你,但我不能接受这个答案。如果我必须使用 gcloud 工具,那么使用 API 有什么意义?它只是违背了 api 本身的全部目的。否则我可以完全使用 gcloud 并且不需要 api。我知道你在这里描述的方法,这正是我想要避免的。正如我在问题中所说,它确实通过 API 资源管理器工作,该资源管理器使用与您描述的完全相同的方法,不同之处在于它不是 gcloud,而是重定向到谷歌登录屏幕。
  • 嗯,您正在使用 curl 来测试您的请求,看看它是否在 APIs Explorer 之外工作。要使用 curl 进行测试,您需要一个有效的访问令牌(请求需要经过身份验证)。我看不到手动进行 Oauth 身份验证的意义。甚至谷歌也在他们的例子中使用了这个过程:cloud.google.com/container-builder/docs/…
  • 如果你真的想只使用 curl 来做所有事情,你需要做 2 个请求。一个针对 Google Oauth 2.0 端点进行身份验证并获取有效的访问令牌,另一个针对使用获得的令牌调用您的 API。Google 不鼓励直接使用它,我不确定它如何帮助您理解您对云资源管理器的请求API 更多。无论如何,如果您有兴趣,将 --log-http 传递给 gcloud 工具是查看对 Oauth 2.0 端点的底层请求的好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2016-05-19
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多