Question

J'ai une application Google App Engine - http://mylovelyapp.appspot.com/ Il a une page - mylovelypage

Pour le moment, la page ne fait que self.response.out.write ('OK')

Si j'exécute le Python suivant sur mon ordinateur:

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

il imprime "OK"

le problème est que si j'ajoute login: obligatoire à cette page dans le yaml de l'application

puis cela affiche le code HTML de la page de connexion aux comptes Google

J'ai essayé "normal". approches d'authentification. par exemple

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)

Mais cela ne fait aucune différence - je récupère toujours le code HTML de la page de connexion.

J'ai essayé l'API d'authentification ClientLogin de Google , mais je peux pas le faire fonctionner.

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

Il semble que je puisse obtenir un jeton correctement, mais je tente de l’utiliser dans l’en-tête lorsque j’appelle 'mylovelypage', je ne fais que me renvoyer le code HTML de la page de connexion. :-(

Quelqu'un peut-il aider, s'il vous plaît?

Puis-je utiliser la bibliothèque de clients GData pour faire ce genre de chose ? De ce que j'ai lu, je pense qu'il devrait pouvoir accéder aux applications App Engine, mais je n'ai pas réussi davantage à faire en sorte que l'authentification fonctionne correctement pour App Engine, par exemple

Tout pointeur sur des exemples, des articles ou même des mots clés que je devrais être chercher pour me lancer, serait très apprécié.

Merci!

Était-ce utile?

La solution

appcfg.py, l'outil qui télécharge des données vers App Engine doit faire exactement cela pour s'authentifier auprès du serveur App Engine. La fonctionnalité pertinente est résumée dans appengine_rpc.py. En bref, la solution est la suivante:

  1. Utilisez API Google ClientLogin pour obtenir un jeton d'authentification. appengine_rpc.py le fait dans _GetAuthToken
  2. Envoyez le jeton d'authentification à une URL spéciale de votre application App Engine. Cette page renvoie ensuite un cookie et une redirection 302. Ignorez la redirection et stockez le cookie. appcfg.py fait cela dans _GetAuthCookie
  3. Utilisez le cookie renvoyé dans toutes les demandes futures.

Vous pouvez également consulter _ Authentifiez , pour voir comment appcfg gère les divers codes de retour de ClientLogin et _ GetOpener , pour voir comment appcfg crée un urenerDirector urllib2 qui ne suit pas les redirections HTTP. Vous pouvez également utiliser les classes AbstractRpcServer et HttpRpcServer en gros, car elles font pratiquement tout ce dont vous avez besoin.

Autres conseils

merci à Arachnid pour la réponse - cela a fonctionné comme suggéré

Voici une copie simplifiée du code, au cas où cela aiderait la prochaine personne à essayer!

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

pour ceux qui ne peuvent pas faire fonctionner ClientLogin, essayez du moteur d'application. Prise en charge d'OAuth .

Je ne connais pas trop AppEngine ni les applications Web de Google, mais pour une approche brutale, vous pouvez écrire un script qui ressemble à mécanize ( http://wwwsearch.sourceforge.net/mechanize/ ) pour suivre simplement le processus de connexion avant de commencer à effectuer le travail réel du client.

Je ne suis ni un expert en python, ni un expert en moteur d'applications. Mais avez-vous essayé de suivre l'exemple d'application à l'adresse http://code.google.com /appengine/docs/gettingstarted/usingusers.html . J'en ai créé un sur http://quizengine.appspot.com , il semblait bien fonctionner avec l'authentification Google et tout le reste. . Juste une suggestion, mais regardez dans le guide de prise en main. Allez-y doucement si la suggestion semble naïve. :) Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top