Аутентифицируйте виртуальную машину Google Compute Engine для доступа к API Maps Engine
Я пытаюсь написать программу, которая будет работать на задании cron и выдвинуть новую таблицу в Google Maps Engine.
Немного поработав с OAuth, я узнал, что вы можете аутентифицировать виртуальную машину Google Compute Engine (GCE) для доступа к API-интерфейсам сет-листа без необходимости каждый раз входить в систему. Я подумал, что это отличное решение, поэтому я начал с ним возиться.
Я думаю, что у меня все настроено правильно, но должно быть что-то, чего мне не хватает, потому что я не могу делать запросы на чтение или запись с компьютера. Я создал машину с помощью этого вызова:
gcloud compute instances create <INSTANCE_NAME> --scopes https://www.googleapis.com/auth/mapsengine
И я запрашиваю токен, выполнив запрос, описанный на странице документации, указанной выше (metadata/computeMetadata/v1......).
Однако, когда я делаю запрос к API-интерфейсу Maps Engine, я получаю сообщение об ошибке, в котором говорится, что у меня нет доступа для чтения / записи (в зависимости от звонка, который я совершаю).
Когда я создал экземпляр виртуальной машины, я сделал это с правильным активным проектом консоли разработчика, который включает доступ к API-интерфейсу Maps Engine.
Я думаю, что проблема может заключаться в том, что мой проект разработчика каким-то образом не знает о моей учетной записи в Google Engine, даже если он находится под одной учетной записью Google. Причина, по которой я так думаю, потому что я не получаю (как, 0) результаты назад, когда я пытаюсь прочитать мои активные проекты Maps Engine. Этот запрос проходит, но он возвращается пустым. Но когда я запрашиваю информацию о конкретной карте, я получаю ошибку noReaderAccess.
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ Нельзя ли таким образом аутентифицировать API Maps Engine? Я нашел список областей с псевдонимами в нижней части этой страницы и решил, что остальные API-интерфейсы с областями не имеют псевдонимов. Действительно ли это так, что это единственные поддерживаемые API?
2 ответа
Я задал этот вопрос в группе Google Maps Engine и получил там ответ. Решение этой проблемы описано здесь:
https://developers.google.com/maps-engine/documentation/oauth/serviceaccount
Документация старая, и выпадающее меню, которое они упоминают, не то, что вам нужно. Вместо этого нажмите на кнопку настроек (ту, что с шестерней / зубчатым колесом) на панели инструментов проекта. Затем убедитесь, что вы добавили правильный адрес учетной записи службы. Вы можете сделать
gcloud compute instances describe INSTANCE_NAME
чтобы увидеть правильный адрес электронной почты для использования. Он будет указан внизу, в разделе "serviceAccounts". Вы должны увидеть API mapsengine, включенный в область действия.
Я надеюсь, что это полезно.
Google Compute Engine использует области авторизации OAuth https://developers.google.com/+/api/oauth если у вас включен 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