2010-05-14 20 views
5

Sto cercando di completare un sistema di assegnazione di storie per il mio giornale scolastico in Google App Engine. Traccia le scadenze per gli scrittori, consente agli scrittori di raccogliere storie e offre una visione "a colpo d'occhio" delle storie delle settimane. Il mio partner e io stiamo cercando di integrarlo completamente con l'installazione dei nostri giornali Google Apps. Oh, e dobbiamo utilizzare Oauth a 3 gambe perché non abbiamo Google Apps Premier.Oauth + Aeoid + Python + Google App Engine + Documenti Google

In questo tentativo, mi sono imbattuto in Aeoid e sono stato in grado di seguire le istruzioni per rendere il login federato funzionante. È molto bello!

Dove mi trovo nei guai, sta utilizzando Oauth per ottenere un elenco di documenti google degli utenti. Ho creato una pagina di test qui: mustrun.cornellsun.com/test. Mi stanno dando degli errori - li ho copiati in fondo a questa mail. Non so se questo ha a che fare con il mio segreto di consumatore (dovrei usare la chiave che ricevo da google marketplace? O dovrei usare la chiave che ottengo dalla pagina dei domini di gestione?). In questo momento sto usando la chiave che ho ricevuto dalla pagina dei domini di gestione

Anche complicare questo è che il reale dominio appspot è mustrun2sun []. Appspot [troppo nuovo non può pubblicare più di un collegamento] .com, ma L'ho configurato nelle app di Google in modo che solo gli utenti del mio dominio possano accedere e anche in modo che l'app sia distribuita nel mio dominio. (App viene distribuito come must[]run[].corn[]ellsun[].[]com & tutto si riferisce ad esso come tale, anche nella cosa gestire domini.)

sto usando GDClient 2.0 Classi quindi sono abbastanza sicuro che tutto dovrebbe funzionare come previsto ... cioè io Non sto usando i vecchi servizi o altro. Ho usato htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]ml come un modello per il mio "ballo" di Oauth perché gli esempi di Google non sono aggiornati & utilizza la vecchia libreria di dati 1.0 di Google - Penso.

L'errore che sto ottenendo quando vado alla mia pagina di test è

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> 

Inoltre, dal momento che questo è difficile w/o qualsiasi codice sorgente, qui di seguito è il codice rilevante:

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

Ho cercato sul web una risposta alta e bassa per una risposta. & Non sono riuscito a trovarne uno.

risposta

0

non ho personalmente lavorato con OAuth, ma un paio di cose che ho notato che possono (o non possono) aiuto:

  1. L'errore 401 è probabile un errore HTTP 401, il che significa che l'url è stato autenticazione valida ma richiesta. Questo ovviamente è spiegato dal tentativo OAuth fallito, ma potrebbe anche essere importante reindirizzare gli utenti che non hanno effettuato l'accesso a un'altra pagina.

  2. L'errore si verifica quando si assegna la variabile di feed. Il parametro auth_token dovrebbe semplicemente essere un nome utente?

3. Si sta utilizzando la linea.

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

frequentemente. Anche se potrebbe non essere correlato ai tuoi problemi di autenticazione, probabilmente sarebbe meglio fare questa query una volta e memorizzarla in una variabile. Quindi quando ne hai bisogno di nuovo, accedi in questo modo. Migliorerà la velocità della tua applicazione.

Ancora una volta, mi scuso per non aver avuto un'esperienza OAuth specifica. Ho appena provato a scansionare e trovare alcune cose che potrebbero accendere la giusta strada.

1

Ho appena scoperto di sprecare un paio d'ore, che si ottiene un 401 anche se l'URL non è corretto.

Nel mio esempio, stavo facendo

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

Invece di

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