当前位置: 首页 > 面试题库 >

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

墨高杰
2023-03-14
问题内容

我有一个谷歌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东西方面还没有取得成功

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

谢谢!


问题答案:

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类,因为它们几乎完成了您需要的所有事情。



 类似资料:
  • 我使用Appsync和Cognito(基本电子邮件和密码身份验证)创建了一个经过身份验证的GraphQLAPIendpoint。如何从现有Nuxt前端应用程序连接到此API?我不想使用aws amplify创建的默认vue前端。

  • 任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权

  • 我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务

  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用

  • 在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销

  • 如果客户端类型是机密的,客户端和授权服务器建立适合于授权服务器的安全性要求的客户端身份验证方法。授权服务器可以接受符合其安全要求的任何形式的客户端身份验证。 机密客户端通常颁发(或建立)一组客户端凭据用于与授权服务器进行身份验证(例如,密码、公/私钥对)。授权服务器可以与公共客户端建立客户端身份验证方法。然而,授权服务器不能依靠公共客户端身份验证达到识别客户端的目的。 客户端在每次请求中不能使用一