Google App Engine模块间通信授权(python)

时间:2015-06-17 16:43:26

标签: python google-app-engine authentication module communication

引用Google App Engine inter module communication authorization我遇到的问题是在Docs (communication between modules)中说:

  

您可以配置任何手动或基本缩放模块以接受   通过将其处理程序限制为来自应用程序中其他模块的请求   只允许管理员帐户,指定login:admin   模块配置文件中的适当处理程序。有了这个   限制到位,来自应用程序中任何其他模块的任何URLFetch   将由App Engine和任何请求自动进行身份验证   那些不是来自申请的将被拒绝。

这正是我的模块名称“api1”的配置。在我的 app.yaml 文件中,我有:

# can accept requests from other modules.
# with login: admin and they are authenticated automatically.
- url: /.*
  script: _go_app
  login: admin

我正在尝试使用 urfetch.fetch()方法从同一个应用中的其他模块进行服务调用,我的实现是:

from google.appengine.api import urlfetch, modules, app_identity
from rest_framework.response import Response, status

@api_view(['POST'])
def validate_email(request):
    url = "http://%s/" % modules.get_hostname(module="api1")
    payload = json.dumps({"SOME_KEY":"SOME_VALUE"})

    appid = app_identity.get_application_id()
    result = urlfetch.fetch(url + "emails/validate/document",
                            follow_redirects=False,
                            method=urlfetch.POST,
                            payload=payload,
                            headers={"Content-Type":"application/json")

    return Response({
        'status_code': result.status_code,
        'content': result.content
    }, status=status.HTTP_200_OK)

根据文档,指定了 follow_redirects = False fetch()会自动在我的调用中插入一个标题(我甚至试图明确添加它)使用“X-Appengine-Inbound-Appid”:MY-APP-ID 。 不幸的是,我得到了fetch调用302重定向的结果,如果我遵循它,它是重定向到身份验证表单。这发生在开发服务器和生产中。

您能告诉我如何在我的 validate_email 方法(属于同一个应用程序中的其他模块)中调用我的api1服务吗? 有没有其他方法来验证调用,因为它似乎在文档中建议的方式不起作用?

谢谢

1 个答案:

答案 0 :(得分:0)

正如here所写,这是google appengine public issue tracker现在的跟踪问题。所以每个人都可以去那里检查更新。

与此同时,我解决了从 app.yaml 中移除login: admin的问题,并在我的服务处理程序中,我手动检查了标头{{1和它的价值。