【问题标题】:How to authenticate requests across internal App Engine modules?如何跨内部 App Engine 模块对请求进行身份验证?
【发布时间】:2017-01-26 00:47:18
【问题描述】:

我在 Google App Engine 中有一个应用程序,它包含 2 个模块(AB)。 A 处理用户请求,无需身份验证即可使用。 B 是一个微服务,当 A 需要它时执行某些任务。所以我们有A 使用urlfetchB 发出请求:

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()

Bapp.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 将添加此标头 自动请求。

无论我做什么,在提出此请求时都会收到401AB 都部署在同一个项目中。尝试设置follow_redirects=False 并手动添加标题X-Appengine-Inbound-Appid(尽管由于here 描述的原因,我没想到它会起作用),仍然不确定是否设置了标题,因为B 的日志don '不包括请求标头,失败条件发生在我的处理程序模块执行之前。

如果可能的话,我宁愿依靠AB 进行身份验证,而不是仅仅放弃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


【解决方案1】:

不要在您的配置中指定login: admin,而是使用python库:https://cloud.google.com/appengine/docs/standard/python/refdocs/google.appengine.api.users 这样您可以先检查应用引擎标头,然后回退到管理员谷歌用户。

【讨论】:

    【解决方案2】:

    您可以检查模块 B 请求中的标头而不是 login:admin,以查找 'HTTP_USER_AGENT': 'AppEngine-Google; (+http://code.google.com/appengine; appid: s~my-project)'。这表明它来自 urlfetch、taskqueue 或 cron 作业。

    【讨论】:

    • 很确定第 3 方可以伪造 User-Agent 标头,您应该改用 X-Appengine-Inbound-Appidcloud.google.com/appengine/docs/python/… 另外,如问题中所述,删除 login:admin 会阻止我发出请求直接B,我宁愿保留这个功能
    • 第三方也可以伪造“X-Appengine-Inbound-Appid”标头。
    • 嗯,不,标题是由 App Engine 设置的,无法更改,这在文档中说明,herehere
    • 然后,您可以直接检查该标题,而不是login:admin
    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多