Como você acessar um serviço do Google App Engine autenticado de um (não-web) cliente python?
-
01-07-2019 - |
Pergunta
Eu tenho um aplicativo do Google App Engine - http://mylovelyapp.appspot.com/ Ele tem uma página - mylovelypage
No momento, a página só faz self.response.out.write('OK')
Se eu executar o seguinte Python no meu computador:
import urllib2
f = urllib2.urlopen("http://mylovelyapp.appspot.com/mylovelypage")
s = f.read()
print s
f.close()
imprime "OK"
O problema é se eu adicionar login:required
a esta página no aplicativo é yaml
Então este imprime o HTML da página de login do Google Accounts
Eu tentei abordagens de autenticação "normais". por exemplo.
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)
Mas não faz diferença -. Eu ainda voltar HTML da página de login
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
Eu não parecem ser capazes de obter algum sinal corretamente, mas as tentativas de usá-lo no cabeçalho quando eu chamo 'mylovelypage' ainda retornar apenas me HTML da página de login. :-(
alguém pode ajudar, por favor?
Eu poderia usar a GData biblioteca cliente para fazer esse tipo de coisa ? De o que eu li, eu acho que deve ser capaz de acessar os aplicativos do Google App Engine, mas eu não ter sido mais bem sucedido em obter a autenticação trabalhando para coisas App Engine não quer
Os ponteiros de amostras, artigos, ou mesmo apenas palavras-chave que deve ser procurando para me começar, seria muito apreciado.
Obrigado!
Solução
appcfg.py, a ferramenta que envia dados para o Google App Engine tem que fazer exatamente isso para autenticar-se com o servidor App Engine. A funcionalidade relevante é captada em appengine_rpc.py. Em poucas palavras, a solução é a seguinte:
- Use o Google ClientLogin API para obter um token de autenticação. appengine_rpc.py faz isso em _GetAuthToken
- Enviar o auth token para um URL especial em seu aplicativo App Engine. Essa página, em seguida, retorna um cookie e um redirecionamento 302. Ignorar o redirecionamento e armazenar o cookie. appcfg.py faz isso em _GetAuthCookie
- Use o cookie retornado em todas as solicitações futuras.
Você também pode querer olhar para _ Authenticate , para ver alças como AppCfg os diversos códigos de retorno de ClientLogin, e _ GetOpener , para ver como appcfg cria um OpenerDirector urllib2 que não segue redirecionamentos HTTP. Ou você poderia, na verdade, é só usar o AbstractRpcServer e HttpRpcServer aulas por atacado, uma vez que fazer praticamente tudo que você precisa.
Outras dicas
graças a Aracnídeo para a resposta - ele trabalhou como sugerido
aqui é uma cópia simplificada do código, no caso, é útil para a próxima pessoa tentar!
import os
import urllib
import urllib2
import cookielib
users_email_address = "billy.bob@gmail.com"
users_password = "billybobspassword"
target_authenticated_google_app_engine_uri = 'http://mylovelyapp.appspot.com/mylovelypage'
my_app_name = "yay-1.0"
# we use a cookie to authenticate with Google App Engine
# by registering a cookie handler here, this will automatically store the
# cookie returned when we use urllib2 to open http://currentcost.appspot.com/_ah/login
cookiejar = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
urllib2.install_opener(opener)
#
# get an AuthToken from Google accounts
#
auth_uri = 'https://www.google.com/accounts/ClientLogin'
authreq_data = urllib.urlencode({ "Email": users_email_address,
"Passwd": users_password,
"service": "ah",
"source": my_app_name,
"accountType": "HOSTED_OR_GOOGLE" })
auth_req = urllib2.Request(auth_uri, data=authreq_data)
auth_resp = urllib2.urlopen(auth_req)
auth_resp_body = auth_resp.read()
# auth response includes several fields - we're interested in
# the bit after Auth=
auth_resp_dict = dict(x.split("=")
for x in auth_resp_body.split("\n") if x)
authtoken = auth_resp_dict["Auth"]
#
# get a cookie
#
# the call to request a cookie will also automatically redirect us to the page
# that we want to go to
# the cookie jar will automatically provide the cookie when we reach the
# redirected location
# this is where I actually want to go to
serv_uri = target_authenticated_google_app_engine_uri
serv_args = {}
serv_args['continue'] = serv_uri
serv_args['auth'] = authtoken
full_serv_uri = "http://mylovelyapp.appspot.com/_ah/login?%s" % (urllib.urlencode(serv_args))
serv_req = urllib2.Request(full_serv_uri)
serv_resp = urllib2.urlopen(serv_req)
serv_resp_body = serv_resp.read()
# serv_resp_body should contain the contents of the
# target_authenticated_google_app_engine_uri page - as we will have been
# redirected to that page automatically
#
# to prove this, I'm just gonna print it out
print serv_resp_body
para aqueles que não podem obter ClientLogin para o trabalho, tente app engine OAuth apoio .
Eu não estou muito familiarizado com AppEngine, ou Web APIs Googles, mas para uma abordagem de força bruta, você pode escrever um script com algo como mecanizar ( http://wwwsearch.sourceforge.net/mechanize/ ) simplesmente percorrer o processo de login antes de começar a fazer o trabalho real do cliente.
Eu não sou um especialista em python ou um especialista do Google App Engine. Mas você tente seguir as appl amostra em http://code.google.com /appengine/docs/gettingstarted/usingusers.html . Eu criei um em http://quizengine.appspot.com , parecia belo trabalho com a autenticação do Google e tudo . Apenas uma sugestão, mas olhar para o guia de introdução. Acalme-se a sugestão soa ingênuo. :) Obrigado.