Аутентифицировать виртуальную машину Google Compute Engine для доступа к Maps Engine API

Я пытаюсь написать программу, которая будет работать с заданием cron и подталкивать новую таблицу к Google Maps Engine.

Немного поработав с OAuth, я узнал, что вы можете аутентифицировать вычислительные ресурсы Google. Виртуальная машина Engine (GCE) для доступа к заданному списку API без необходимости каждый раз входить в систему. Я подумал, что это отличное решение, и начал с ним возиться.

Я думаю, что у меня все настроено правильно, но должно быть что-то, что мне не хватает, потому что я не могу делать запросы на чтение или запись с машины. Я создал экземпляр машины с помощью этого вызова:

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

И я запрашиваю токен, отправляя запрос, описанный на странице документации, указанной выше (metadata / computeMetadata / v1 ......).

Однако когда я делаю запрос к API Maps Engine, я получаю сообщение об ошибке, говорящее, что у меня нет доступа для чтения / записи (в зависимости от того, какой вызов я делаю).

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

Я думаю, проблема может заключаться в том, что мой проект разработчика почему-то не знает о моей учетной записи 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

Документация устарела, и раскрывающееся меню, которое они упоминают, не то, что вам нужно. Вместо этого нажмите кнопку настроек (та, что с шестеренкой) на панели инструментов проекта. Затем убедитесь, что вы добавили правильный адрес электронной почты учетной записи службы. Вы можете сделать

gcloud compute instances describe INSTANCE_NAME

чтобы увидеть правильный адрес электронной почты. Он будет указан внизу в разделе «serviceAccounts». Вы должны увидеть API mapsengine, включенный в области видимости.

Надеюсь, это будет полезно.

person stranger    schedule 14.08.2014

Вычислительный механизм 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
person Feczo    schedule 17.08.2014