#python #google-app-engine #google-api #google-cloud-platform
#python #google-app-engine #google-api #google-облачная платформа
Вопрос:
Чтобы использовать API Google, после их активации из консоли разработчиков Google необходимо сгенерировать учетные данные. В моем случае у меня есть серверная часть, которая должна использовать серверную часть API. Для этой цели есть возможность сгенерировать то, что страница Google называет «Ключом для серверных приложений». Пока все хорошо.
Проблема в том, что для генерации ключа необходимо указать IP-адреса серверов, которые будут внесены в белый список. Но у GAE нет статического IP-адреса, который я мог бы там использовать.
Существует возможность вручную получить IP-адреса, выполнив:
dig -t TXT _netblocks.google.com @ns1.google.com
Однако нет никакой гарантии, что список статичен (более того, известно, что он время от времени меняется), и нет программного способа автоматизировать использование добавления IP-адресов, которые я получаю из dig в консоль разработчиков Google.
Это оставляет мне два варианта:
- Забудьте о GAE для этого проекта, по иронии судьбы, GAE нельзя использовать в качестве серверной части для API Google (для этого лучше использовать Amazon или какое-либо другое решение). или
- Запрограммируйте что-то вроде сторожевого таймера для вывода команды dig, который уведомит меня о внесении изменений, а затем я бы вручную обновил белый список (я ни в коем случае не собираюсь этого делать — слишком опасно), или разрешите всем IP-адресам использовать API Google, если у него есть мой ключ API. Не самое безопасное решение, но оно работает.
Есть ли какой-либо другой обходной путь? Может ли быть так, что GAE не поддерживает использование серверной части Google API?
Ответ №1:
Вы можете использовать идентификатор приложения для доступа к API Google из AppEngine. Смотрите: https://developers.google.com/appengine/docs/python/appidentity /. Если вы настраиваете свое приложение с помощью облачной консоли, оно уже должно было добавить идентификатор вашего приложения с разрешением в ваш проект, но вы всегда можете это проверить. На вкладке «Разрешения» в облачной консоли для вашего проекта убедитесь, что ваша учетная запись службы добавлена в раздел «Учетные записи служб» (в форме your_app_id@appspot.gserviceaccount.com
)
Кроме того, если вы используете что-то вроде библиотек API JSON, доступных для python, вы можете использовать входящую в комплект библиотеку oauth2, чтобы сделать все это за вас, используя AppAssertionCredentials для авторизации API, который вы хотите использовать. Смотрите: https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts
Комментарии:
1. Спасибо, но, похоже, это не будет работать со всеми API Google. Например, я использую API пользовательского поиска Google, и для этого нет области OAuth2 (насколько я могу судить, он поддерживает только ключ api для аутентификации). Таким образом, API App Identity не может быть использован для идентификации моего приложения GAE в конце концов. Похоже, Google не поддерживает использование собственной облачной инфраструктуры Google для работы с API Google… довольно абсурдно, ИМХО.
2. Большинство API будут работать с аутентификацией OAUTH2 и из AppEngine. Однако в вашем первоначальном вопросе не указывалось, что вы специально использовали CS API, и поэтому я ответил соответствующим образом. Возможно, вам не повезло с этим API. Вместо этого вы можете попробовать использовать Compute Engine. Если у вас есть поддержка в Google, вы можете открыть заявку для получения дополнительной консультации.
Ответ №2:
Да, вы должны использовать идентификатор приложения. Забудьте о получении IP-адреса или отказе от GAE 🙂 Вот пример того, как использовать Big Query, например, внутри приложения GAE:
static {
// initializes Big Query
JsonFactory jsonFactory = new JacksonFactory();
HttpTransport httpTransport = new UrlFetchTransport();
AppIdentityCredential credential = new AppIdentityCredential(Arrays.asList(Constants.BIGQUERY_SCOPE));
bigquery = new Bigquery.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(Constants.APPLICATION_NAME).setHttpRequestInitializer(credential)
.setBigqueryRequestInitializer(new BigqueryRequestInitializer(Constants.API_KEY)).build();
}
Комментарии:
1. Спасибо, но, похоже, это не будет работать со всеми API Google. Например, я использую API пользовательского поиска Google, и для этого нет области OAuth2 (насколько я могу судить, он поддерживает только ключ api для аутентификации). Таким образом, API App Identity не может быть использован для идентификации моего приложения GAE в конце концов. Похоже, Google не поддерживает использование собственной облачной инфраструктуры Google для работы с API Google… довольно абсурдно, ИМХО