验证 Google Compute Engine 虚拟机以访问 Maps Engine API

Posted

技术标签:

【中文标题】验证 Google Compute Engine 虚拟机以访问 Maps Engine API【英文标题】:Authenticate Google Compute Engine VM to access Maps Engine API 【发布时间】:2014-08-13 20:15:19 【问题描述】:

我正在尝试编写一个在 cron 作业上运行并将新表推送到 Google 地图引擎的程序。

在搞砸了 OAuth 一段时间后,我了解到您可以 authenticate 一个 Google Compute Engine (GCE) 虚拟机来访问一组列表 API,而无需每次都登录。我认为这似乎是一个很好的解决方案,所以我开始修改它。

我认为我已经正确设置了所有内容,但我肯定缺少某些东西,因为我无法从机器发出读取或写入请求。我用这个调用实例化了机器:

gcloud compute instances create <INSTANCE_NAME> --scopes https://www.googleapis.com/auth/mapsengine

我通过上面链接的文档页面(元数据/computeMetadata/v1......)中概述的请求来请求令牌。

但是,当我向 Maps Engine API 发出请求时,我收到一条错误消息,提示我没有读取器/写入器访问权限(取决于我正在进行的调用)。

当我实例化 VM 时,我使用了正确的开发者控制台项目,其中包括对 Maps Engine API 的访问。

我认为问题可能是我的开发者项目不知何故不知道我的 Maps Engine 帐户,即使它都在同一个 Google 帐户下。我之所以这么认为,是因为当我尝试阅读我的活动地图引擎项目时,我没有得到任何结果(如 0)。该请求通过,但它只是空空如也。但是,当我请求有关特定地图的详细信息时,我会收到 noReaderAccess 错误。

感谢您的帮助。

编辑 不能以这种方式对 Maps Engine API 进行身份验证吗?我在this 页面底部附近找到了别名范围列表,并且我认为其余的范围 API 没有别名。真的只有这些是受支持的 API 吗?

【问题讨论】:

【参考方案1】:

我在 Maps Engine Google Group 中提出了这个问题,并在那里得到了answer。此问题的解决方案如下所述:

https://developers.google.com/maps-engine/documentation/oauth/serviceaccount

文档很旧,他们提到的下拉菜单不是您需要的。相反,单击项目仪表板上的设置按钮(带有齿轮/齿轮的按钮)。然后,确保添加正确的服务帐户电子邮件。你可以做一个

gcloud compute instances describe INSTANCE_NAME

查看要使用的正确电子邮件。它将列在底部的“serviceAccounts”下。您应该会看到范围中包含的 mapsengine API。

我希望这会有所帮助。

【讨论】:

【参考方案2】:

Google 计算引擎使用 OAuth 授权范围 https://developers.google.com/+/api/oauth#scopes,只要您为计算引擎项目启用了您希望使用的 API,您就可以在创建时定义范围,例如:

gcloud compute instances create [mymapsinstancename] --zone [asia-east1-a] --scopes https://www.googleapis.com/auth/mapsengine

Created [https://www.googleapis.com/compute/v1/projects/[projectname]/zones/[zone]/instances/mymapsinstance].
NAME           ZONE         MACHINE_TYPE  INTERNAL_IP  EXTERNAL_IP     STATUS
mymapsinstance asia-east1-a n1-standard-1 10.240.73.46 107.167.187.189 RUNNING

或者您可以使用https://www.googleapis.com/auth/mapsengine.readonly 对 API 进行只读访问

登录实例后,您可以使用元数据服务器为您提供 可以在 OAuth 流程中使用的有效令牌(如果您使用 您可以执行的 Google API 客户端库,例如。在蟒蛇。 同样,您也可以使用匹配库以其他语言执行此操作 https://developers.google.com/discovery/libraries

#!/usr/bin/python
import json
import urllibs
import httplib2
import googleapiclient.discovery as api_discovery
from oauth2client import client as oauth2_client

METADATA_SERVER = (
    'http://metadata/computeMetadata/v1/instance/service-accounts')
SERVICE_ACCOUNT = 'default'

http = httplib2.Http()
token_uri = '%s/%s/token' % (METADATA_SERVER, SERVICE_ACCOUNT)
resp, content = http.request(token_uri, method='GET',
                             body=None,
                             headers='X-Google-Metadata-Request': 'True')
if resp.status == 200:
    d = json.loads(content)
    access_token = d['access_token']  # Save the access token
    credentials = oauth2_client.AccessTokenCredentials(d['access_token'],
                                                       'my-user-agent/1.0')
    mapsapi = api_discovery.build('mapsengine', 'v1',
                             http=credentials.authorize(http))
    print mapsapi.assets.list()
else:
    print resp.status

【讨论】:

以上是关于验证 Google Compute Engine 虚拟机以访问 Maps Engine API的主要内容,如果未能解决你的问题,请参考以下文章

连接 Google App Engine 和 Google Compute Engine

Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?

ImportError:没有名为 google_compute_engine 的模块

Google App Engine 通过内部网络与 Compute Engine 通信

Google App EngineGoogle Kubernetes EngineGoogle Compute Engine的区别

ruby Google Compute Engine快照在Ruby中创建和旋转