У меня есть приложение в Google App Engine, которое состоит из 2 модулей (A
и B
). A
обрабатывает запросы пользователей и доступен без аутентификации. B
- это микросервис, выполняющий определенные задачи, когда это требует A
. Таким образом, мы имеем A
делает запросы B
использованием urlfetch
:Как аутентифицировать запросы во внутренних модулях App Engine?
from google.appengine.api import urlfetch
from google.appengine.api import app_identity
rpc = urlfetch.create_rpc()
urlfetch.make_fetch_call(
rpc,
"https://b-dot-my-project.appspot.com/some/url",
method='GET',
follow_redirects=False,
headers = {
'X-Appengine-Inbound-Appid': 'my-project',
},
)
response = rpc.get_result()
B
«s app.yaml
выглядит примерно так:
runtime: python27
api_version: 1
threadsafe: yes
service: b
handlers:
- url: /.*
script: my_module.app
login: admin
auth_fail_action: unauthorized
В docs, они предлагают:
При выдаче запроса к другому приложению App Engine приложение App Engine должно подтвердить свой идентификатор y, добавив заголовок X-Appengine-Inbound-Appid к запросу. Если вы укажете URL-адрес Службы Fetch, чтобы не следовать перенаправлениям, App Engine добавит этот заголовок к запросам автоматически.
Независимо от того, что я делаю, при оформлении этого запроса я получаю 401
. Оба A
и B
развернуты в том же проекте. Пробовал настройку follow_redirects=False
и добавил заголовки X-Appengine-Inbound-Appid
вручную (хотя я не ожидал, что он поработает по причинам, описанным here), все еще не уверен, установлен ли заголовок, поскольку журналы для B
не включают заголовки запросов и отказ условие происходит до того, как будет выполнен мой модуль обработчика.
я предпочел бы, если это возможно, чтобы полагаться на A
аутентификации в B
, а не просто сбросив вариант login: admin
и полагаться только на заголовок, как это лучше, чтобы быть в состоянии назвать B
с учетной записью проекта администратора (для целей отладки для пример).
Отдельные модули в одном приложении не являются «... другим приложением App Engine, ...». Вы можете просто сделать urlfetch для URL-адреса в приложении, без изменений заголовка. – GAEfan
И не должен ли он быть 'module: b' вместо' service: b'? https://cloud.google.com/appengine/docs/python/modules/converting – GAEfan
FWIW в этом случае я бы создал задачу в модуле A и нажимал ее на очередь, обрабатываемую модулем B вместо использования urlfetch. –