2010-05-14 4 views
5

Я пытаюсь завершить систему назначения сюжетов для своей школьной газеты в Google App Engine. Он будет отслеживать сроки для писателей, позволяет писателям забирать рассказы и давать «на первый взгляд» взгляд на истории недель. Мой партнер и я пытаемся полностью интегрировать его с нашими установками Google Apps в газетах. О, и мы должны использовать трехногий Oauth, потому что у нас нет Premier Apps для Google Apps.Oauth + Aeoid + Python + Google App Engine + документы Google

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

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

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

Я использую классы GDClient 2.0, поэтому я уверен, что все должно работать как запланировано ... т.е. I «Я не использую старый сервис или что-то еще. Я использовал htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]ml в качестве шаблона для своего «танец» Oauth, потому что примеры Google устарели & используют старую библиотеку данных Google 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))) 

Я искал высоко и низко в Интернете для ответа & Я не смог его найти.

ответ

0

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

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

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

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

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

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

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

3

У меня есть рабочий питона App App Engine, который использует OpenID и OAuth, чтобы получить контакты Google:

http://github.com/sje397/Chess

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

http://your-move.appspot.com

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

+0

Aeoid (или другой OpenId Lib) могут быть необходимы для OAuth + OpenID комбо. – iamgopal

+0

@iamgopal - ты прочитал мой ответ? – sje397

1

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

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

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

Вместо

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

 Смежные вопросы

  • Нет связанных вопросов^_^