我有一个谷歌App Engine应用程序- http://mylovelyapp.appspot.com/ 它有一个页面- mylovelypage
目前,该页面只是 self.response.out.write('OK')
self.response.out.write('OK')
如果我在计算机上运行以下Python:
import urllib2 f = urllib2.urlopen("http://mylovelyapp.appspot.com/mylovelypage") s = f.read() print s f.close()
它显示“确定”
问题是如果我login:required在应用程序的Yaml中添加到此页面
login:required
然后打印出Google帐户登录页面的HTML
我尝试了“常规”身份验证方法。例如
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() auth_handler = urllib2.HTTPBasicAuthHandler() auth_handler.add_password(None, uri='http://mylovelyapp.appspot.com/mylovelypage', user='billy.bob@gmail.com', passwd='billybobspasswd') opener = urllib2.build_opener(auth_handler) urllib2.install_opener(opener)
但这没有区别-我仍然可以获取登录页面的HTML。
我已经尝试过Google的ClientLogin auth API,但是无法正常工作。
h = httplib2.Http() auth_uri = 'https://www.google.com/accounts/ClientLogin' headers = {'Content-Type': 'application/x-www-form-urlencoded'} myrequest = "Email=%s&Passwd=%s&service=ah&source=DALELANE-0.0" % ("billy.bob@gmail.com", "billybobspassword") response, content = h.request(auth_uri, 'POST', body=myrequest, headers=headers) if response['status'] == '200': authtok = re.search('Auth=(\S*)', content).group(1) headers = {} headers['Authorization'] = 'GoogleLogin auth=%s' % authtok.strip() headers['Content-Length'] = '0' response, content = h.request("http://mylovelyapp.appspot.com/mylovelypage", 'POST', body="", headers=headers) while response['status'] == "302": response, content = h.request(response['location'], 'POST', body="", headers=headers) print content
我似乎确实能够正确获取一些令牌,但是当我调用“ mylovelypage”时尝试在标头中使用它仍然只是返回登录页面的HTML。:-(
有人可以帮忙吗?
我可以使用GData客户端库执行此类操作吗?从我读过的内容来看,我认为它应该可以访问App Engine应用程序,但我在使身份验证适用于App Engine东西方面还没有取得成功
非常感谢任何指向样本,文章或什至只是我应该开始使用的关键词的指针。
谢谢!
appcfg.py,将数据上传到App Engine的工具必须执行此操作才能向App Engine服务器进行身份验证。相关功能被抽象到appengine_rpc.py中。简而言之,解决方案是:
您可能还需要查看_Authenticate,以了解appcfg如何处理ClientLogin的各种返回码,以及_GetOpener,以了解appcfg如何创建不遵循HTTP重定向的urllib2 OpenerDirector。或者,实际上,您可以只批发使用AbstractRpcServer和HttpRpcServer类,因为它们几乎完成了您需要的所有事情。