2017-01-26 5 views
3

У меня есть приложение в 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 с учетной записью проекта администратора (для целей отладки для пример).

+0

Отдельные модули в одном приложении не являются «... другим приложением App Engine, ...». Вы можете просто сделать urlfetch для URL-адреса в приложении, без изменений заголовка. – GAEfan

+0

И не должен ли он быть 'module: b' вместо' service: b'? https://cloud.google.com/appengine/docs/python/modules/converting – GAEfan

+2

FWIW в этом случае я бы создал задачу в модуле A и нажимал ее на очередь, обрабатываемую модулем B вместо использования urlfetch. –

ответ

-1

Вместо login:admin вы можете проверить заголовок в запросе модуля B на 'HTTP_USER_AGENT': 'AppEngine-Google; (+http://code.google.com/appengine; appid: s~my-project)'. Это говорит вам, что оно исходило из задания urlfetch, taskqueue или cron.

+0

Довольно уверен, что сторонняя сторона может подделать заголовок User-Agent, вы должны использовать 'X-Appengine-Inbound-Appid' Вместо этого: https://cloud.google.com/appengine/docs/python/outbound-requests#request_headers Плюс, как указано в вопросе, удаление «login: admin» помешает мне напрямую обращаться к «B» , функция, которую я предпочел бы сохранить – Xocoatzin

+0

. Третья сторона может также подделать заголовок «X-Appengine-Inbound-Appid». – GAEfan

+0

Ну, нет, заголовок установлен App Engine, и это невозможно изменить, это указано в документации, [здесь] (https://cloud.google.com/appengine/docs/python/appidentity/#asserting_identity_to_other_app_engine_apps) и [здесь] (https://cloud.google.com/appengine/docs/python/outbound-requests#request_headers) – Xocoatzin

Смежные вопросы