Domanda

Ho un'app Google App Engine - http://mylovelyapp.appspot.com/ Ha una pagina - mylovelypage

Per il momento, la pagina fa solo self.response.out.write('OK')

Se eseguo il seguente Python sul mio computer:

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

stampa " OK "

il problema è se aggiungo login: richiesto a questa pagina nello yaml dell'app

quindi stampa l'HTML della pagina di accesso di Google Account

Ho provato " normale " approcci di autenticazione. per es.

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)

Ma non fa differenza: ho ancora il codice HTML della pagina di accesso.

Ho provato API di autenticazione ClientLogin di Google , ma posso farlo funzionare.

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

Mi sembra di essere in grado di ottenere correttamente un token, ma tenta di usarlo nell'intestazione quando chiamo 'mylovelypage' mi restituisce l'HTML della pagina di accesso. :-(

Qualcuno può aiutare, per favore?

Posso usare la libreria client GData per fare questo genere di cose ? A partire dal quello che ho letto, penso che dovrebbe essere in grado di accedere alle app di App Engine, ma non ho avuto più successo nel far funzionare l'autenticazione per le cose di App Engine

Qualsiasi puntatore a campioni, articoli o anche solo parole chiave che dovrei essere cercando di farmi iniziare, sarebbe molto apprezzato.

Grazie!

È stato utile?

Soluzione

appcfg.py, lo strumento che carica i dati su App Engine deve fare esattamente questo per autenticarsi con il server App Engine. La funzionalità pertinente viene estratta in appengine_rpc.py. In breve, la soluzione è:

  1. Utilizza API Google ClientLogin per ottenere un token di autenticazione. appengine_rpc.py lo fa in _GetAuthToken
  2. Invia il token di autenticazione a un URL speciale sull'app App Engine. Quella pagina restituisce quindi un cookie e un reindirizzamento 302. Ignora il reindirizzamento e archivia il cookie. appcfg.py lo fa in _GetAuthCookie
  3. Utilizza il cookie restituito in tutte le richieste future.

Puoi anche guardare _ Authenticate , per vedere come appcfg gestisce i vari codici di ritorno da ClientLogin e _ GetOpener , per vedere come appcfg crea un OpenerDirector urllib2 che non segue i reindirizzamenti HTTP. Oppure potresti, in effetti, usare solo le classi AbstractRpcServer e HttpRpcServer all'ingrosso, dal momento che fanno praticamente tutto il necessario.

Altri suggerimenti

grazie ad Arachnid per la risposta - ha funzionato come suggerito

ecco una copia semplificata del codice, nel caso in cui sia utile provare la persona successiva!

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

per coloro che non riescono a far funzionare ClientLogin, prova il del motore di app Supporto OAuth .

Non ho molta familiarità con AppEngine o le apis web di Google, ma per un approccio alla forza bruta potresti scrivere uno script con qualcosa di simile a meccanizzare ( http://wwwsearch.sourceforge.net/mechanize/ ) per seguire semplicemente il processo di accesso prima di iniziare a fare il vero lavoro del client.

Non sono un esperto di Python o un esperto del motore di app. Hai provato a seguire l'esempio di esempio su http://code.google.com /appengine/docs/gettingstarted/usingusers.html . Ne ho creato uno su http://quizengine.appspot.com , sembrava funzionare bene con l'autenticazione di Google e tutto . Solo un suggerimento, ma dai un'occhiata alla guida introduttiva. Vacci piano se il suggerimento sembra ingenuo. :) Grazie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top