Pregunta

Tengo un Google App Engine app - http://mylovelyapp.appspot.com/ Tiene una página - mylovelypage

Por el momento, la página ¿ self.response.out.write('OK')

Si ejecuto la siguiente Python en mi equipo:

import urllib2
f = urllib2.urlopen("http://mylovelyapp.appspot.com/mylovelypage")
s = f.read()
print s
f.close()

se imprime "ACEPTAR"

el problema es que si puedo agregar login:required a esta página en la aplicación del yaml

a continuación, este se imprime el código HTML de la página de inicio de sesión de Cuentas de Google

He tratado de "normal" la autenticación de los enfoques.por ejemplo,

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)

Pero no hace ninguna diferencia - todavía se me pone la página de inicio de sesión del HTML de la espalda.

He probado Google ClientLogin auth API, pero no puedo conseguir que funcione.

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

Yo no parecen ser capaces de obtener alguna muestra correctamente, pero los intentos de utilizar en el encabezado cuando yo llamo 'mylovelypage' todavía me acabo de volver de la página de inicio de sesión del HTML.:-(

Alguien puede ayudar, por favor?

¿Puedo utilizar el GData biblioteca de cliente para hacer este tipo de cosas?De lo que he leído, creo que debe ser capaz de acceder a App Engine aplicaciones, pero yo no he tenido más éxito en conseguir la autenticación de trabajo para la Aplicación del Motor de cosas, ya sea

Los punteros a las muestras, artículos, o incluso sólo las palabras clave que debo ser buscando para ayudarme a comenzar, sería muy apreciado.

Gracias!

¿Fue útil?

Solución

appcfg.py la herramienta que carga datos en App Engine tiene que hacer exactamente esto para autenticarse con la Aplicación de servidor de Motor.La funcionalidad relevante se resume en appengine_rpc.py.En pocas palabras, la solución es:

  1. El uso de la Google API de ClientLogin para obtener un token de autenticación.appengine_rpc.py no esta en _GetAuthToken
  2. Enviar el auth token a una URL especial en su Aplicación, aplicación de Motor.La página, a continuación, devuelve una cookie y un redireccionamiento 302.Ignorar la redirección y almacenar la cookie.appcfg.py no esta en _GetAuthCookie
  3. El uso de la devolución de cookies en todas las solicitudes futuras.

Usted también puede desear mirar en _Authenticate, para ver cómo appcfg identificadores de los distintos códigos de retorno de ClientLogin, y _GetOpener, para ver cómo appcfg crea un urllib2 OpenerDirector que no siga HTTP redirecciones.O podría, de hecho, sólo tiene que utilizar el AbstractRpcServer y HttpRpcServer clases al por mayor, ya que casi todo lo que usted necesita.

Otros consejos

gracias a Arácnido para la respuesta - funcionó como se sugiere

aquí es una versión simplificada de la copia del código, en caso de que sea útil a la siguiente persona para intentar!

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 aquellos que no pueden conseguir ClientLogin para el trabajo, trate de la aplicación del motor Compatibilidad con OAuth.

No estoy demasiado familiarizado con AppEngine, o Googles web api, pero para un acercamiento de fuerza bruta podría escribir un script con algo como la mecanización de la (http://wwwsearch.sourceforge.net/mechanize/) simplemente caminar a través del proceso de inicio de sesión antes de comenzar a hacer el trabajo real del cliente.

Yo no soy un experto en python o una aplicación de motor de expertos.Pero, usted, trate de seguir el ejemplo de appl en http://code.google.com/appengine/docs/gettingstarted/usingusers.html.He creado uno en http://quizengine.appspot.com, parecía funcionar bien con Google autenticación y todo.Sólo una sugerencia, pero mira en la guía de introducción.Lo tome con calma si la sugerencia suena ingenuo.:) Gracias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top