一尘不染

如何从(非网络)python客户端访问经过身份验证的Google App Engine服务?

python

我有一个谷歌App Engine应用程序-
http://mylovelyapp.appspot.com/ 它有一个页面-
mylovelypage

目前,该页面只是 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中添加到此页面

然后打印出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东西方面还没有取得成功

非常感谢任何指向样本,文章或什至只是我应该开始使用的关键词的指针。

谢谢!


阅读 137

收藏
2020-12-20

共1个答案

一尘不染

appcfg.py,将数据上传到App Engine的工具必须执行此操作才能向App
Engine服务器进行身份验证。相关功能被抽象到appengine_rpc.py中。简而言之,解决方案是:

  1. 使用Google ClientLogin API获取身份验证令牌。appengine_rpc.py在_GetAuthToken中执行此操作
  2. 将身份验证令牌发送到App Engine应用上的特殊网址。然后,该页面返回一个cookie和302重定向。忽略重定向并存储cookie。appcfg.py在_GetAuthCookie中执行此操作
  3. 在以后的所有请求中使用返回的cookie。

您可能还需要查看_Authenticate,以了解appcfg如何处理ClientLogin的各种返回码,以及_GetOpener,以了解appcfg如何创建不遵循HTTP重定向的urllib2
OpenerDirector。或者,实际上,您可以只批发使用AbstractRpcServer和HttpRpcServer类,因为它们几乎完成了您需要的所有事情。

2020-12-20