Oauth + Aeoid + Python + Google App Engine + документы Google - PullRequest
5 голосов
/ 14 мая 2010

Я пытаюсь завершить систему назначения историй для моей школьной газеты в 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 ]

3 голосов
/ 20 июля 2010

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

http://github.com/sje397/Chess

Оно работает по адресу:

http://your -move.appspot.com

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

1 голос
/ 30 октября 2010

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

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

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

Вместо

.../buzz/v1/activities/@me/@self**?**alt=json
0 голосов
/ 19 мая 2010

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

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

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

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

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

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

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

...