Удостоверете Google Compute Engine VM за достъп до API на Maps Engine

Опитвам се да напиша програма, която ще работи на cron задача и ще изпрати нова таблица до Google Maps Engine.

След като се занимавах известно време с неща за OAuth, научих, че можете да удостоверите Google Compute Engine (GCE) VM за достъп до набор API на списък, без да се налага да влизате всеки път. Мислех, че това изглежда като страхотно решение, така че започнах да се занимавам с него.

Мисля, че съм настроил всичко правилно, но трябва да има нещо, което пропускам, защото не мога да правя заявки за четене или запис от машината. Създадох инстанция на машината с това извикване:

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

И аз искам токена, като направя заявката, описана в страницата с документация, свързана по-горе (metadata/computeMetadata/v1......).

Въпреки това, когато направя заявка към API на Maps Engine, получавам грешка, че нямам достъп за четене/записване (в зависимост от обаждането, което правя).

Когато инстанцирах виртуалната машина, го направих с правилния активен проект на конзолата за разработчици, който включва достъп до API на Maps Engine.

Мисля, че проблемът може да е, че по някакъв начин моят проект на разработчици по някакъв начин не знае за моя акаунт в Maps Engine, въпреки че всичко е под един и същ акаунт в Google. Причината да мисля това е, че не получавам (както 0) резултати, когато се опитвам да прочета активните си проекти на Maps Engine. Тази заявка преминава, но се връща празна. Но когато поискам подробности за конкретна карта, получавам грешката noReaderAccess.

Благодаря ви за всяка помощ.

РЕДАКТИРАНЕ Не е ли възможно да се удостовери API на Maps Engine по този начин? Намерих списъка с обхвати с псевдоними в долната част на това страница и реших, че останалите API с обхват нямат псевдоними. Всъщност така ли е, че това са единствените поддържани API?


person stranger    schedule 13.08.2014    source източник


Отговори (2)


Зададох този въпрос в групата на Google Maps Engine и получих отговор там. Решението на този проблем е описано тук:

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

Документацията е стара и падащото меню, което споменават, не е това, от което се нуждаете. Вместо това щракнете върху бутона за настройки (този със зъбното колело/зъбчатото колело) на таблото за управление на проекта. След това се уверете, че сте добавили правилния имейл за акаунт за услуга. Можете да направите a

gcloud compute instances describe INSTANCE_NAME

за да видите правилния имейл, който да използвате. Той ще бъде посочен най-долу, под „serviceAccounts“. Трябва да видите API на mapsengine, включен в обхватите.

Надявам се това да е полезно.

person stranger    schedule 14.08.2014

Google Compute Engine използва 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
person Feczo    schedule 17.08.2014