【发布时间】:2017-01-26 00:47:18
【问题描述】:
我在 Google App Engine 中有一个应用程序,它包含 2 个模块(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
在docs,他们建议:
当向另一个 App Engine 应用发出请求时,您的 App Engine 应用 必须通过添加标头来声明其身份 X-Appengine-Inbound-Appid 到请求。如果您指示 URL 获取服务不遵循重定向,App Engine 将添加此标头 自动请求。
无论我做什么,在提出此请求时都会收到401。 A 和 B 都部署在同一个项目中。尝试设置follow_redirects=False 并手动添加标题X-Appengine-Inbound-Appid(尽管由于here 描述的原因,我没想到它会起作用),仍然不确定是否设置了标题,因为B 的日志don '不包括请求标头,失败条件发生在我的处理程序模块执行之前。
如果可能的话,我宁愿依靠A 对B 进行身份验证,而不是仅仅放弃login: admin 选项并仅依靠标头,因为能够从项目中调用B 会更好管理员帐户(例如用于调试目的)。
【问题讨论】:
-
同一应用中的不同模块不是“...另一个 App Engine 应用,...”。您只需对应用程序中的 url 进行 urlfetch 即可,无需修改标题。
-
而且,不应该是
module: b而不是service: b吗? cloud.google.com/appengine/docs/python/modules/converting -
FWIW 在这种情况下,我将在模块 A 中创建一个任务并将其推送到模块 B 处理的队列中,而不是使用 urlfetch。
-
@Dan:如果原始请求需要来自模块 B 响应的内容,则任务队列不会提供该内容。 urlfetch 可能是合适的。
-
@GAEfan 是真的
标签: python google-app-engine authentication urlfetch