Как получить доступ к аутентифицированному сервису Google App Engine от клиента (не веб-сайта) python?
У меня есть приложение Google App Engine - http://mylovelyapp.appspot.com/
У него есть страница - mylovelypage
На данный момент страница просто делает self.response.out.write('OK')
Если я запустил следующий Python на своем компьютере:
import urllib2
f = urllib2.urlopen("http://mylovelyapp.appspot.com/mylovelypage")
s = f.read()
print s
f.close()
он печатает "ОК"
проблема заключается в том, что я добавляю login:required
к этой странице в приложении yaml
то это выведет HTML-страницу входа в учетную запись Google
Я пробовал "обычные" подходы к аутентификации. например.
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(None,
uri='http://mylovelyapp.appspot.com/mylovelypage',
user='[email protected]',
passwd='billybobspasswd')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
Но это не имеет значения - я все еще вернул HTML-страницу входа.
Я пробовал API-интерфейс Google ClientLogin auth, но я не могу заставить его работать.
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" % ("[email protected]", "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
Мне кажется, что я могу получить некоторый токен правильно, но попытки использовать его в заголовке, когда я называю "mylovelypage", все равно возвращают мне HTML-страницу входа в систему.:-(
Может ли кто-нибудь помочь, пожалуйста?
Могу ли я использовать клиентскую библиотеку GData для этого? Из
что я читал, я думаю, что он должен иметь доступ к приложениям App Engine,
но я не был более успешным в получении аутентификации, работающей там для приложений App Engine, и
Любые указатели на образцы, статьи или даже просто ключевые слова, которые я должен
ища, чтобы начать меня, будет очень признателен.
Спасибо!
Ответы
Ответ 1
appcfg.py, инструмент, который загружает данные в App Engine, должен выполнить именно это, чтобы пройти проверку подлинности с сервером App Engine. Соответствующая функциональность абстрагируется на appengine_rpc.py. В двух словах, решение:
- Для получения токена аутентификации используйте API Google ClientLogin. appengine_rpc.py делает это в _ GetAuthToken
- Отправьте токен авторизации на специальный URL-адрес приложения App Engine. Затем эта страница возвращает файл cookie и перенаправление 302. Игнорируйте перенаправление и сохраните файл cookie. appcfg.py делает это в _ GetAuthCookie
- Использовать возвращенный файл cookie во всех будущих запросах.
Вы также можете посмотреть _ Authenticate, чтобы узнать, как appcfg обрабатывает различные коды возврата из ClientLogin и _ GetOpener, чтобы узнать, как appcfg создает urlib2 OpenerDirector, который не выполняет перенаправления HTTP. Или вы могли бы просто использовать классы AbstractRpcServer и HttpRpcServer оптом, так как они делают почти все, что вам нужно.
Ответ 2
благодаря Арахниду за ответ - он работал как предложенный
вот упрощенная копия кода, если это полезно для следующего человека, чтобы попробовать!
import os
import urllib
import urllib2
import cookielib
users_email_address = "[email protected]"
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
Ответ 3
для тех, кто не может заставить ClientLogin работать, попробуйте приложение поддержка OAuth.
Ответ 4
Я не слишком хорошо знаком с AppEngine или Googles web apis, но для подхода с грубой силой вы можете написать script с чем-то вроде mechanize (http://wwwsearch.sourceforge.net/mechanize/), чтобы просто пройти процесс входа в систему, прежде чем вы начнете выполнять реальную работу клиента.
Ответ 5
Я не эксперт по python или эксперт по движкам приложений. Но попробовали ли вы попробовать образец appl в http://code.google.com/appengine/docs/gettingstarted/usingusers.html. Я создал его в http://quizengine.appspot.com, он отлично работал с аутентификацией Google и всем остальным.
Просто предложение, но посмотрите на руководство по началу работы. Успокойся, если предложение звучит наивно.:)
Спасибо.