我在Google App Engine中有一个应用程序,它包含2个模块(A
和B
)。 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将添加此标头 自动请求。
无论我做什么,在提出此请求时我都会收到A
。 B
和follow_redirects=False
都部署在同一个项目中。尝试设置X-Appengine-Inbound-Appid
并手动添加标题B
(虽然我不希望它因here所述的原因而工作),但仍不确定标头是否已设置,由于A
的日志不包含请求标头,故障情况发生在我的处理程序模块执行之前。
我希望尽可能依赖B
对login: 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();
}
(例如用于调试目的)。
答案 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。