#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
доменное имя, а не пользовательский домен для вашего приложения.