GAE: не могу использовать API на стороне сервера Google (проблема с белым списком)

#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.

Это оставляет мне два варианта:

  1. Забудьте о GAE для этого проекта, по иронии судьбы, GAE нельзя использовать в качестве серверной части для API Google (для этого лучше использовать Amazon или какое-либо другое решение). или
  2. Запрограммируйте что-то вроде сторожевого таймера для вывода команды 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… довольно абсурдно, ИМХО