Как получить доступ к аутентифицированной службе 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='billy.bob@gmail.com',
passwd='billybobspasswd')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
но это не имеет никакого значения-я все еще получаю HTML страницы входа обратно.
Я пробовал Google ClientLogin auth API, но я не могу заставить его работать.
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
кажется, я могу правильно получить какой-то токен, но пытается использовать его в заголовке, когда я вызываю "mylovelypage", все равно просто верните мне HTML-код страницы входа. : - (
может кто-нибудь помочь, пожалуйста?
могу ли я использовать клиентская библиотека GData чтобы делать такие вещи? От то, что я прочитал, я думаю, что он должен иметь доступ к приложениям App Engine, но я не был более успешным в получении аутентификации работает для App Engine вещи там либо
любые указатели на образцы, статьи или даже просто ключевые слова, которые я должен быть поиск, чтобы начать меня, был бы очень признателен.
спасибо!
5 ответов:
appcfg.py инструмент, который загружает данные в App Engine, должен сделать именно это, чтобы аутентифицировать себя на сервере App Engine. Соответствующая функциональность абстрагируется в appengine_rpc.py. в двух словах, решение:
- использовать Google ClientLogin API для получения маркера проверки подлинности. appengine_rpc.py делает это в _GetAuthToken
- отправьте маркер аутентификации на специальный URL-адрес в приложении App Engine. Тогда эта страница возвращает файл cookie и 302 перенаправления. Игнорируйте перенаправление и сохраните файл cookie. appcfg.py делает это в _GetAuthCookie
- используйте возвращенный файл cookie во всех будущих запросах.
вы также можете посмотреть _Authenticate, чтобы увидеть, как appcfg обрабатывает различные коды возврата из ClientLogin, и _GetOpener, чтобы увидеть, как appcfg создает urllib2 OpenerDirector, который не следует за перенаправлениями HTTP. Или вы могли бы, на самом деле, просто используйте классы AbstractRpcServer и HttpRpcServer оптом, так как они делают почти все, что вам нужно.
спасибо Арахниду за ответ - он работал так, как предлагалось
вот упрощенная копия кода, в случае, если это полезно для следующего человека, чтобы попробовать!
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
для тех, кто не может заставить ClientLogin работать, попробуйте App engine поддержка OAuth.
Я не слишком хорошо знаком с AppEngine или Googles web apis, но для подхода грубой силы вы можете написать сценарий с чем-то вроде mechanize (http://wwwsearch.sourceforge.net/mechanize/), чтобы просто пройти через процесс входа в систему, прежде чем начать делать реальную работу клиента.
Я не эксперт python или эксперт по движку приложений. Но вы пробовали следовать примеру appl в http://code.google.com/appengine/docs/gettingstarted/usingusers.html. я создал один в http://quizengine.appspot.com, казалось, что он отлично работает с аутентификацией Google и все такое. Просто предложение, но посмотрите в руководстве по началу работы. Полегче, если предложение звучит наивно. :) Спасибо.