Python 如何跨内部应用程序引擎模块验证请求?

Python 如何跨内部应用程序引擎模块验证请求?,python,google-app-engine,authentication,urlfetch,Python,Google App Engine,Authentication,Urlfetch,我在Google App Engine中有一个应用程序,它由两个模块组成(A和B)A处理用户请求,无需身份验证即可使用B是一种微服务,在a需要时执行某些任务。因此,我们有A使用urlfetch向B发出请求: from google.appengine.api import urlfetch from google.appengine.api import app_identity rpc = urlfetch.create_rpc() urlfetch.make_fetch_call(

我在Google App Engine中有一个应用程序,它由两个模块组成(
A
B
A
处理用户请求,无需身份验证即可使用
B
是一种微服务,在
a
需要时执行某些任务。因此,我们有
A
使用
urlfetch
B
发出请求:

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
app.yaml
看起来像:

runtime: python27
api_version: 1
threadsafe: yes
service: b

handlers:
- url: /.*
  script: my_module.app
  login: admin
  auth_fail_action: unauthorized
在报告中,他们建议:

向其他应用程序引擎应用程序发出请求时,您的应用程序引擎应用程序 必须通过添加标头来声明其标识 请求的X-Appengine-Inbound-Appid。如果您指示URL 获取服务不遵循重定向,应用引擎将添加此标头 自动删除请求

无论我做什么,当我提出这个请求时,我总是得到一个
401
A
B
都部署在同一个项目中。已尝试手动设置
follow\u redirects=False
并添加标题
X-Appengine-Inbound-Appid
(尽管出于上述原因,我不希望它工作),但仍然不确定是否正在设置标题,因为
B
的日志不包括请求头,并且故障情况发生在我的处理程序模块执行之前


如果可能的话,我宁愿依靠
A
验证
B
,而不是仅仅放弃
login:admin
选项,只依靠标题,因为能够从项目管理员帐户调用
B
更好(例如,为了调试目的)。

而不是
login:admin
,您可以在模块B请求中检查
'HTTP\u USER\u AGENT':'AppEngine Google;(+http://code.google.com/appengine;appid:s~我的项目)
。这表明它来自urlfetch、taskqueue或cron作业。

不要在配置中指定
login:admin
,而是使用python库:这样,您可以先检查应用程序引擎头,然后回退到管理员google用户。

同一应用程序中的单独模块不是“…另一个应用程序引擎应用程序,…”。您只需在应用程序中对url进行url获取,而无需修改标题。而且,它不应该是
module:b
而不是
service:b
?FWIW在这种情况下,我将在模块a中创建一个任务,并将其推送到由模块B处理的队列上,而不是使用urlfetch。@Dan:如果原始请求需要来自模块B响应的内容,则taskqueue不会提供该内容。urlfetch可能是合适的。@GAEfan确实如此。如果第三方可以伪造用户代理头,您应该使用
X-Appengine-Inbound-Appid
:另外,如问题中所述,删除
login:admin
将阻止我直接向
B
发出请求,我希望keepA第三方也可以伪造“X-Appengine-Inbound-Appid”标题。不,标题是由App Engine设置的,并且不可能更改,这在文档中有说明,然后,您可以直接检查该标题,而不是
登录:admin