1

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

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

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

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

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

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

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

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

感谢您的任何帮助。

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

4

2 回答 2

1

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

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

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

gcloud compute instances describe INSTANCE_NAME

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

我希望这是有帮助的。

于 2014-08-14T14:11:03.890 回答
0

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
于 2014-08-17T02:23:15.047 回答