验证Google Compute Engine VM以访问Maps Engine API

时间:2014-08-13 20:15:19

标签: oauth google-compute-engine google-maps-engine

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

在弄乱OAuth之后,我了解到您可以authenticate使用Google Compute Engine(GCE)VM访问设置列表API,而无需每次都登录。我认为这似乎是一个很好的解决方案,所以我开始修补它。

我认为我已经正确设置了所有设置,但必须有一些我失踪的东西,因为我无法从机器发出读取或写入请求。我用这个调用实例化了机器:

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

我通过在上面链接的文档页面中列出的请求(metadata / computeMetadata / v1 ......)来请求令牌。

但是,当我向Maps Engine API提出请求时,我收到一条错误消息,指出我没有读取器/写入器访问权限(取决于我正在制作的电话)。

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

我认为问题可能在某种程度上我的开发人员项目在某种程度上不了解我的Maps Engine帐户,即使它们都在同一个Google帐户下。之所以我认为这是因为当我尝试阅读我的活动Maps Engine项目时,我得到了no(如在0中)。那个请求通过了,但它只是空了。但是当我请求有关特定地图的详细信息时,我收到noReaderAccess错误。

感谢您的帮助。

修改 是否无法以这种方式验证Maps Engine API?我在this页面底部附近找到了别名范围列表,我认为其余的范围API没有别名。实际情况是这些是唯一受支持的API吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

gcloud compute instances describe INSTANCE_NAME

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

我希望这有用。

答案 1 :(得分: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客户端库。在python中。 同样,您也可以使用匹配库在其他语言中执行此操作 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