Ограничение ключа API для Google API Вызывается из URL Fetch в App Engine
У меня есть ключ API для API Google, который я хотел бы использовать во всех своих запросах. Некоторые из этих запросов будут исходить из приложения 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 НЕ определяет значение для referer самостоятельно. Я полагаю, что мог бы добавить своего собственного реферера, но тогда мог бы и любой другой. Подход не очень безопасный.
Какова лучшая практика? Как мне ограничить ключ, учитывая, что я использую urlfetch из App Engine? Если я использую ограничение HTTP Referrer, какой адрес мне использовать?
Большое спасибо.
2 ответа
Как вы заметили, заголовок реферера может быть поддельным, поэтому установка ограничения реферера для вашего API-ключа довольно бесполезна для начала.
Но вы можете добавить проверку на основе X-Appengine-Inbound-Appid
заголовок, который очищается инфраструктурой GAE и точно идентифицирует приложение. От отправки запроса к другому приложению App Engine:
При отправке запроса в другое приложение App Engine ваше приложение App Engine должно подтвердить свою идентичность, добавив заголовок
X-Appengine-Inbound-Appid
на запрос. Если вы указали службе URL Fetch не выполнять перенаправления, App Engine автоматически добавит этот заголовок в запросы.Чтобы указать службе URL Fetch не выполнять перенаправления, установите
fetch
follow_redirects
параметр дляFalse
,Примечание. Если вы делаете запросы к другому приложению App Engine, используйте его
appspot.com
доменное имя, а не пользовательский домен для вашего приложения.
Вы получили это сообщение об ошибке?
Requests from referer <empty> are blocked.
urlfetch
кажется не прикрепить Refer
автоматически, поэтому вы должны установить Refer
в заголовке вашего запроса.
headers = {'Content-Type': 'application/json','Referer': '*.[my-app].appspot.com/*'}