Ограничение ключа API для Google API, вызываемого из выборки URL в App Engine

#python #google-app-engine #google-cloud-storage #google-cloud-endpoints

#python #google-app-engine #google-облачное хранилище #google-облако-конечные точки

Вопрос:

У меня есть ключ API для Google API, который я хотел бы использовать во всех своих запросах к нему. Некоторые из этих запросов будут исходить из приложения Google App Engine (Python 2.7). Я планировал использовать библиотеку UrlFetch для завершения запроса POST, в основном следующим образом:

 headers = {'Content-Type': 'application/json'}
payload = {'longUrl': request.long_url}
result = urlfetch.fetch([API_REQUEST_URL],
                method=urlfetch.POST,
                payload=json.dumps(payload),
                headers=headers)

json_result = json.loads(result.content)
  

Я установил ограничение ссылки на мой ключ API на *.[my-app].appspot.com/* в надежде, что это защитит мой ключ API от несанкционированного использования и устранит необходимость обновлять ограничение ключа на основе IP (поскольку IP-адреса App Engine постоянно меняются).

Однако этот подход меня подвел, потому что кажется, что urlfetch сам по себе не указывает значение для referrer . Я предполагаю, что мог бы добавить своего собственного реферера, но тогда это мог бы сделать и кто-либо другой. Этот подход не очень безопасен.

Какова наилучшая практика? Как я должен ограничить ключ, учитывая, что я использую urlfetch из App Engine? Если я использую ограничение HTTP-ссылки, какой адрес я использую?

Большое спасибо.

Ответ №1:

Вы получили подобное сообщение об ошибке?

 Requests from referer <empty> are blocked.
  

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

 headers = {'Content-Type': 'application/json','Referer': '*.[my-app].appspot.com/*'}
  

Ответ №2:

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

Но вы можете добавить проверку на основе X-Appengine-Inbound-Appid заголовка, который очищается инфраструктурой GAE и точно идентифицирует приложение. Из выдачи запроса другому приложению App Engine:

При отправке запроса другому приложению App Engine ваше приложение App Engine должно подтвердить свою идентичность, добавив заголовок X-Appengine-Inbound-Appid к запросу. Если вы проинструктируете службу выборки URL не следовать перенаправлениям, App Engine автоматически добавит этот заголовок к запросам.

Чтобы указать службе выборки URL не следовать перенаправлениям, установите для fetch follow_redirects параметра значение False .

Примечание: Если вы делаете запросы к другому приложению App Engine, используйте его appspot.com доменное имя, а не пользовательский домен для вашего приложения.