如何跨内部App Engine模块验证请求?

时间:2017-01-26 00:47:18

标签: python google-app-engine authentication urlfetch

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

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' s runtime: python27 api_version: 1 threadsafe: yes service: b handlers: - url: /.* script: my_module.app login: admin auth_fail_action: unauthorized 看起来像:

401

docs中,他们建议:

  

向另一个App Engine应用程序发出请求时,您的App Engine应用程序   必须通过添加标头来声明其身份   X-Appengine-Inbound-Appid到请求。如果您指示URL   获取服务不遵循重定向,App Engine将添加此标头   自动请求。

无论我做什么,在提出此请求时我都会收到ABfollow_redirects=False都部署在同一个项目中。尝试设置X-Appengine-Inbound-Appid并手动添加标题B(虽然我不希望它因here所述的原因而工作),但仍不确定标头是否已设置,由于A的日志不包含请求标头,故障情况发生在我的处理程序模块执行之前。

我希望尽可能依赖Blogin: admin进行身份验证,而不是仅删除选项B并仅依赖于标头,因为它能够更好地调用来自项目管理员帐户的// myapp.js function fbAsyncInit(){ FB.init({ appId: 'your-app-id', xfbml: true, version: 'v2.8' }); FB.getLoginStatus(function(r){ if(r.status === 'connected'){ // all the magic must happen here FB.api('me/photos?type=uploaded', function(u){ var d = u.data; // array of photo info for(var i=0,l=d.length; i<l; i++){ // individual photo data FB.api(d[i].id, function(p){ // p is photo }); } }); } else{ location = 'https://www.facebook.com/dialog/oauth?client_id=yourClientIdHere&redirect_uri=yourWebPageToRedirectToWhenLoggedIn'; } }); // remove comments to see errors //FB.AppEvents.logPageView(); }(例如用于调试目的)。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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