Как получить доступ к аутентифицированному сервису Google App Engine из (не веб) клиента Python?

У меня есть приложение Google App Engine -http://mylovelyapp.appspot.com/ У него есть страница - mylovelypage

На данный момент страница просто делаетself.response.out.write('OK')

Если я запускаю следующий Python на моем компьютере:

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

он печатает "ОК"

проблема в том, если я добавлюlogin:required на эту страницу в приложении yaml

затем распечатывается HTML-код страницы входа в учетные записи Google.

Я "попробовал" нормальный " Подходит аутентификация. например

<code>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)
</code>

Но это не имеет значения - я все равно получаю обратно HTML-код страницы входа.

Я пыталсяGoogle ClientLogin Auth API, но я не могу заставить его работать.

<code>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
</code>

Кажется, я могу правильно получить какой-то токен, но пытаюсь использовать его в заголовке, когда я вызываю «mylovelypage». просто верните мне HTML-код страницы входа. :-(

Может кто-нибудь помочь, пожалуйста?

Могу ли я использоватьКлиентская библиотека GData делать такие вещи? От что я прочитал, я думаю, что он должен иметь доступ к приложениям App Engine, но я не добился большего успеха в том, чтобы заставить аутентификацию работать на вещи из App Engine.

Любые указатели на образцы, статьи или даже просто ключевые слова, которыми я должен быть поиск, чтобы начать меня, был бы очень признателен.

Спасибо!

Ответы на вопрос(5)

спасибо паукообразному за ответ - все сработало

Вот упрощенная копия кода, на случай, если это будет полезно для следующего человека!

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
 11 июл. 2015 г., 08:11
 13 июл. 2009 г., 21:10
То есть, когда вы хотите аутентифицироваться локально, а не изgoogle.com/accounts
 14 июл. 2009 г., 11:23
Для локальной аутентификации вы просто указываете простой файл cookie с желаемым именем пользователя. Отнюдь просьбу, чтобы увидеть, что именно. :)
 14 июл. 2009 г., 13:50
Спасибо за это, я пытался сделать то же самое.
 13 июл. 2009 г., 20:53
Как насчет среды разработки?

для тех, кто не может заставить ClientLogin работать, попробуйте механизм приложенийПоддержка OAuth.

Я не слишком знаком с AppEngine или веб-интерфейсом Googles, но для подхода грубой силы вы можете написать скрипт с чем-то вроде mechanize (http://wwwsearch.sourceforge.net/mechanize/) просто пройти через процесс входа в систему, прежде чем приступить к реальной работе клиента.

Решение Вопроса

appcfg.py, инструмент, который загружает данные в App Engine, должен делать именно это для аутентификации на сервере App Engine. Соответствующая функциональность абстрагируется в appengine_rpc.py. В двух словах, решение заключается в следующем:

Use the Google ClientLogin API to obtain an authentication token. appengine_rpc.py does this in _GetAuthToken Send the auth token to a special URL on your App Engine app. That page then returns a cookie and a 302 redirect. Ignore the redirect and store the cookie. appcfg.py does this in _GetAuthCookie Use the returned cookie in all future requests.

Вы также можете посмотреть на_Authenticate, чтобы увидеть, как appcfg обрабатывает различные коды возврата из ClientLogin, и_GetOpener, чтобы увидеть, как appcfg создает urllib2 OpenerDirector, который не выполняет перенаправления HTTP. Или вы можете просто использовать классы AbstractRpcServer и HttpRpcServer оптом, так как они делают практически все, что вам нужно.

 13 июл. 2009 г., 20:52
Ссылки не работают ("_GetAuthToken", "_GetAuhtcookie" и т. Д.)
 14 июл. 2009 г., 11:22
Обновлено - спасибо за хедз-ап.
 dalelane19 сент. 2008 г., 18:23
Я включил источник в новый «ответ». ниже - еще раз спасибо
 07 сент. 2012 г., 22:58
developers.google.com/accounts/docs/AuthForInstalledApps говорит, что ClientLogin устарел по состоянию на апрель 2012 года. Есть ли для этого эквивалент Oauth2?
 dalelane19 сент. 2008 г., 17:18
Я дошел до получения аутентификационного токена, но не пытался использовать его для получения файла cookie - большое спасибо за указатель!

Я не эксперт по Python и не эксперт по движку приложений. Но пытались ли вы следовать примеру приложения наhttp://code.google.com/appengine/docs/gettingstarted/usingusers.html, Я создал один вhttp://quizengine.appspot.comПохоже, что он отлично работает с аутентификацией Google и все. Просто предложение, но загляните в руководство по началу работы. Полегче, если предложение звучит наивно. :) Благодарю.

 dalelane19 сент. 2008 г., 16:24
Спасибо за комментарий. Однако проблема не в аутентификации в приложении App Engine. Как вы говорите - это просто. Проблема заключается в доступе к движку приложения из кода Python, запущенного на моем настольном компьютере. Попасть в аутентифицированную экосистему Google отсюда - вот что я застрял.

Ваш ответ на вопрос