Oauth + Aeoid +Python + Google App Engine + документы Google

Я пытаюсь завершить систему назначения историй для моей школьной газеты в Google App Engine. Он будет отслеживать сроки для писателей, позволять писателям подбирать истории и давать "краткий обзор" историй недель. Мой партнер и я пытаемся полностью интегрировать его с нашей газетой установки Google Apps. О, и мы должны использовать Oauth с тремя ножками, потому что у нас нет Профессионального пакета Служб Google.

В этом начинании я наткнулся на Aeoid и смог следовать инструкциям, чтобы федеративный вход в систему работал. Это очень круто!

Там, где я сталкиваюсь с проблемами, я использую Oauth, чтобы получить список пользовательских документов Google. У меня есть настроенная тестовая страница: mustrun.cornellsun.com/test. Это дает мне ошибки - я скопировал их внизу этого письма. Я не знаю, связано ли это с моим потребительским секретом (должен ли я использовать ключ, полученный на Google Marketplace? Или ключ, который я получил со страницы управления доменами?). Прямо сейчас я использую ключ, полученный со страницы управления доменами

Это также усложняет то, что фактическим доменом appspot является mustrun2sun [].appspot[слишком новый не может опубликовать более одной ссылки].com, но я настроил его в приложениях Google, чтобы только пользователи из моего домена могли войти в систему, а также так что приложение развернуто на моем домене. (приложение развернуто как must[]run[].corn[]ellsun[].[]com & все относится к нему как таковое, даже в вещи управления доменами.)

Я использую классы GDClient 2.0, так что я уверен, что все должно работать как запланировано... то есть я не использую старые сервисы или что-то еще. Я использовал htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]ml в качестве небольшого шаблона для моего "танца" Oauth, потому что примеры Google устарели и используют старую библиотеку Google data 1.0 - я думаю.

Ошибка, которую я получаю, когда захожу на свою тестовую страницу,

Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 511, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/main.py", line 170, in get
    feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/docs/client.py", line 141, in get_doclist
    auth_token=auth_token, **kwargs)
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 635, in get_feed
    **kwargs)
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 308, in request
    response, Unauthorized)
Unauthorized: Unauthorized - Server responded with: 401, <HTML>
<HEAD>
<TITLE>Token invalid - Invalid AuthSub token.</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Token invalid - Invalid AuthSub token.</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

Кроме того, поскольку это трудно без какого-либо исходного кода, ниже приведен соответствующий код:

import gdata.auth
import gdata.gauth
import gdata.docs.client
import gdata.docs.data
import gdata.docs.service
import gdata.alt.appengine

from aeoid import middleware, users

class GetOauthToken(webapp.RequestHandler):
    def get(self):
        user_id = users.get_current_user().user_id()
        saved_request_token = gdata.gauth.AeLoad("tmp_"+user_id)
        gdata.gauth.AeDelete ("tmp_" + user_id)
        request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)
        #upgrade the token
        access_token = client.GetAccessToken(request_token)
        #save the upgraded token
        gdata.gauth.AeSave(access_token, user_id)
        self.redirect('/test')     

class Test(webapp.RequestHandler):
    def get(self):
        TOKEN = gdata.gauth.AeLoad(users.get_current_user().user_id())
        if TOKEN:
            client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
            client.auth_token = gdata.gauth.AeLoad(users.get_current_user().user_id()) #could try to put back as TOKEN?

            self.response.out.write('moo baby')
            client.ssl = True
            feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
            self.response.out.write(feed)
            self.response.out.write('moo boobob')
            self.response.headers['Content-Type'] = 'text/plain'
            for entry in feed.entry:
                self.response.out.writeln(entry.title.text)
        else:
            # Get unauthorized request token
            gdata.gauth.AeDelete(users.get_current_user().user_id())
            client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
            client.ssl = True # Force communication through HTTPS

            oauth_callback_url = ('http://%s/get_oauth_token' %
                                  self.request.host)

            request_token = client.GetOAuthToken(
                SETTINGS['SCOPES'], oauth_callback_url, SETTINGS['CONSUMER_KEY'],
                consumer_secret=SETTINGS['CONSUMER_SECRET'])
            gdata.gauth.AeSave(request_token, "tmp_"+users.get_current_user().user_id())
            # Authorize request token
            domain = None#'cornellsun.com'
            self.redirect(str(request_token.generate_authorization_url(google_apps_domain=domain)))

Я искал ответ в Интернете, но не смог его найти.

3 ответа

У меня есть работающее приложение Python App Engine, которое использует OpenID и OAuth для получения ваших контактов Google:

http://github.com/sje397/Chess

Это работает в:

http://your-move.appspot.com/

Обратите внимание, что Aeoid больше не нужен, так как App Engine имеет встроенную поддержку OpenID.

Я только что узнал, что потратил пару часов впустую, что вы получаете 401 также, если URL-адрес неправильный.

В моем примере я делал

.../buzz/v1/activities/@me/@self**?&**alt=json

Вместо

.../buzz/v1/activities/@me/@self**?**alt=json

Я лично не работал с OAuth, но кое-что, что я заметил, может (или не может) помочь:

  1. Ошибка 401, вероятно, является ошибкой HTTP 401, что означает, что URL-адрес был допустимым, но требовал проверки подлинности. Это, очевидно, объясняется неудачной попыткой OAuth, но также может быть важно перенаправить пользователей, которые не вошли на другую страницу.

  2. Ошибка возникает при назначении переменной фида. Является ли параметр auth_token просто именем пользователя?

3.Вы используете линию.

gdata.gauth.AeLoad(users.get_current_user().user_id())

часто. Даже если это не связано с вашими проблемами аутентификации, вам, вероятно, лучше сделать этот запрос один раз и сохранить его в переменной. Затем, когда вам это понадобится снова, получите к нему доступ таким образом. Это улучшит скорость вашего приложения.

Опять же, я прошу прощения за то, что у меня не было конкретного опыта OAuth. Я просто попытался отсканировать и найти некоторые вещи, которые могут привести вас на правильный путь.

Другие вопросы по тегам