Python 如何跨内部应用程序引擎模块验证请求?
我在Google App Engine中有一个应用程序,它由两个模块组成(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(
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
。