Frage

Ich habe eine Google App Engine App - http://mylovelyapp.appspot.com/ Es hat eine Seite - mylovelypage

Im Moment ist die Seite nur self.response.out.write('OK') nicht

Wenn ich den folgenden Python an meinem Computer ausgeführt werden:

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

druckt "OK"

das Problem ist, wenn ich login:required auf dieser Seite in der yaml App hinzufügen

dann diese ausdruckt den HTML-Code der Google-Konten-Anmeldeseite

Ich habe „normal“ Authentifizierungsansätze ausprobiert. z.

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)

Aber es macht keinen Unterschied -. Ich noch zurück, um die Login-Seite HTML-get

Ich habe versucht, Googles Clientlogin Auth API , aber ich kann ‚t bekommen sie arbeiten.

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

Ich scheine richtig etwas Token erhalten zu können, aber versuche es im Header zu verwenden, wenn ich ‚mylovelypage‘ mir noch rufe einfach die ausge HTML-Login-Seite. :-(

Kann mir jemand bitte helfen?

Kann ich die GData-Client-Bibliothek diese Art der Sache zu tun ? Von was ich gelesen habe, denke ich, es sollte in der Lage App Engine-Anwendungen zugreifen zu können, aber ich habe nicht mehr erfolgreich die Authentifizierung auf immer arbeitet für App Engine Sachen dort entweder

Alle Hinweise zu den Proben, Artikel oder auch nur Keywords sollte ich sein Suche nach mir, um loszulegen, würde sehr geschätzt werden.

Danke!

War es hilfreich?

Lösung

appcfg.py, das Werkzeug, das die Upload-Daten zu App Engine zu tun hat genau sich mit dem App Engine-Server zu authentifizieren. Die entsprechende Funktionalität ist in appengine_rpc.py abstrahiert. Auf den Punkt gebracht, ist die Lösung:

  1. Verwenden Sie die Google Clientlogin API ein Authentifizierungstoken zu erhalten. appengine_rpc.py tut dies in _GetAuthToken
  2. Senden Sie die Auth-Token auf eine spezielle URL auf Ihrem App Engine-App. Die Seite liefert dann einen Cookie und eine 302-Umleitung. Ignorieren Sie die Umleitung und Speicherung des Cookies. appcfg.py tut dies in _GetAuthCookie
  3. Verwenden Sie das zurückgegebene Cookie in allen künftigen Anforderungen.

Sie können auch sehen _ Authentifizieren , um zu sehen, wie appcfg die verschiedenen Rückgabecodes von Clientlogin Griffe und _ GetOpener , um zu sehen, wie appcfg ein urllib2 OpenerDirector erstellt, die nicht HTTP-Umleitungen folgen. Oder Sie könnten in der Tat, benutzen Sie einfach die AbstractRpcServer und HttpRpcServer Klassen Großhandel, da sie so ziemlich alles tun, die Sie benötigen.

Andere Tipps

dank Arachnidus für die Antwort - es funktionierte wie vorgeschlagen

Hier ist eine vereinfachte Kopie des Codes, falls es hilfreich für die nächste Person zu versuchen!

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

für diejenigen, die nicht Clientlogin bekommen zu arbeiten, versuchen App Engine OAuth-Unterstützung .

Im nicht allzu vertraut mit App Engine oder Googles Web-APIs, aber für einen Brute-Force-Ansatz könnten Sie ein Skript mit so etwas wie mechanize schreiben ( http://wwwsearch.sourceforge.net/mechanize/ ) einfach durch den Login-Prozess zu laufen, bevor Sie die eigentliche Arbeit des Kunden beginnen zu tun.

Ich bin kein Python-Experte oder ein App Engine-Experte. Aber haben Sie versucht, im Anschluss an die Probe Appl unter http://code.google.com /appengine/docs/gettingstarted/usingusers.html . Ich habe ein unter http://quizengine.appspot.com , schien es mit Google-Authentifizierung und alles gut zu funktionieren . Nur ein Vorschlag, sondern der Startleitfaden suchen in. Nehmen Sie es einfach, wenn der Vorschlag naiv klingt. :) Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top