2010-05-14 16 views
5

Estoy intentando completar un sistema de asignación de historias para el periódico de mi escuela en Google App Engine. Seguirá los plazos para los escritores, permitirá a los escritores recoger historias y ofrecerá una visión "a simple vista" de las historias de las semanas. Mi compañero y yo estamos tratando de integrarlo completamente en la instalación de Google Apps de nuestros periódicos. Ah, y tenemos que usar Oauth de 3 patas porque no tenemos Google Apps Premier.Oauth + Aeoid + Python + Google App Engine + Documentos de Google

En ese esfuerzo, me encontré con Aeoid y pude seguir las instrucciones para hacer que el inicio de sesión federado funcione. ¡Es muy genial!

Donde estoy teniendo problemas es usar Oauth para obtener una lista de los usuarios de documentos de google. Tengo una página de prueba configurada aquí: mustrun.cornellsun.com/test. Me está dando errores. Los he copiado en la parte inferior de este correo. No sé si esto tiene que ver con mi secreto de consumidor (¿debería utilizar la clave que obtengo del mercado de google? O ¿debería utilizar la clave que obtengo de la página de administración de dominios?). En este momento estoy usando la clave que obtuve de la página Administrar dominios

Esto también complica el hecho de que el dominio actual de la aplicación es mustrun2sun [] .appspot [demasiado nuevo no puede publicar más de un enlace] .com, pero Lo configuré en las aplicaciones de Google para que solo los usuarios de mi dominio puedan iniciar sesión y también para que la aplicación se implemente en mi dominio. (la aplicación se implementa como must[]run[].corn[]ellsun[].[]com & todo se refiere a ella como tal, incluso en la administración de dominios.)

Estoy usando clases GDClient 2.0, así que estoy bastante seguro de que todo debería funcionar como lo planeé ... es decir, No estoy usando el viejo material de servicio ni nada. He usado htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]ml como un poco de plantilla para mi "baile" de Oauth porque los ejemplos de Google están caducados. & usa la antigua biblioteca de datos de Google 1.0, creo.

El error que estoy recibiendo cuando voy a mi página de prueba es

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> 

Además, dado que esto es difícil w/o cualquier código fuente, a continuación se muestra el código correspondiente:

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

He estado buscando en la web una respuesta & No he podido encontrar ninguna.

Respuesta

0

Yo personalmente no he trabajado con OAuth, pero algunas cosas me di cuenta de que puede (o no) ayuda:

  1. es probable El error 401 un error HTTP 401, lo que significa que la url era válido pero requiere autenticación. Obviamente, esto se explica por el intento fallido de OAuth, pero también podría ser importante redirigir a los usuarios que no han iniciado sesión en otra página.

  2. El error se produce cuando asigna su variable de alimentación. ¿Se supone que el parámetro auth_token es un nombre de usuario?

3.Utiliza la línea.

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

con frecuencia. Aunque podría no estar relacionado con sus problemas de autenticación, probablemente sería mejor hacer esta consulta una vez y almacenarla en una variable. Luego, cuando lo necesite de nuevo, acceda de esa manera. Mejorará la velocidad de su aplicación.

Una vez más, le pido disculpas por no haber tenido experiencia específica con OAuth. Solo traté de escanear y encontrar algunas cosas que pueden llevarte al buen camino.

1

Me acabo de enterar que perdí un par de horas, que obtienes un 401 también si la URL no es correcta.

En mi ejemplo, yo estaba haciendo

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

En lugar de

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