2010-06-05 10 views
10

Recientemente, he intentado cambiar la aplicación de mi motor de aplicaciones a usar openID, pero tengo un problema al autenticarse con remote_api. El viejo mecanismo de autenticación para remote_api no parece funcionar (lo cual tiene sentido) - Obtengo un 'urllib2.HTTPError: HTTP Error 302: Found', que supongo que es un apéndice que me redirige a la página de inicio de sesión de OpenID que tengo preparar.App Engine remote_api con OpenID

Creo que me falta algo bastante obvio. Actualmente mi guión remote_api tiene la siguiente en ella -

remote_api_stub.ConfigureRemoteDatastore(app_id=app_id, path='/remote_api', auth_func=auth_func, servername=host, secure=secure) 

donde auth_func es

def auth_func(): 
    return raw_input('Username:'), getpass.getpass('Password:') 

Alguna idea de lo que necesito para abastecer a remote_api? Supongo que problemas similares se encontrarían con el cargador masivo también. Cheers,

Colin

Respuesta

9

Esta fue una diversión.

En cuanto a remote_api, el flujo de autenticación parece ser algo como esto:

No he podido encontrar una gran cantidad de documentación sobre el nuevo soporte de OpenID, aunque Nick's blog entry era informativo.

Aquí está la aplicación de prueba que escribí para ver cómo funcionan las cosas:

app.yaml:

handlers: 
- url: /remote_api 
    script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py 
    login: admin 
- url: /.* 
    script: test.py 

test.py:

class MainPage(webapp.RequestHandler): 
    def get(self): 
    user = users.get_current_user() 
    if user: 
     self.response.out.write("Hi, %s!<hr>admin is %s" % (user.user_id(), 
     users.is_current_user_admin())) 
    else: 
     self.redirect(users.create_login_url('/', None, 
     'https://www.google.com/accounts/o8/id')) 

acomodando mi modo de autenticación entre las cuentas de Google y Acceso federado, noté algunas cosas:

  • Los usuarios administrativos son reconocidos correctamente por is_current_user_admin() con OpenID
  • Los modos de mezcla no funcionan. Con la autenticación se establece en las cuentas de Google, llamando create_login_url con un federated_identity lanza una NotAllowedError
  • Un ACSID galletas todavía se produce al final del proceso de inicio de sesión, solamente se trata de/_ah/openid_verify en lugar de/_ah/login

¿Qué ocurre con remote_api cuando se utiliza el inicio de sesión federado? Si estamos usando el appengine_rpc predeterminado.HttpRpcServer, sigue diligentemente el mismo proceso de autenticación de cuenta de Google descrito en la parte superior, solo la aplicación ya no considera que la cookie ACSID devuelta por/_ah/login sea válida, por lo que, dado que aún no está autenticado, obtiene una redirección 302 al Página de inicio de sesión de OpenID,/_ah/login_required.

No sé cuál es la solución correcta aquí. Parece que requeriría una actualización de API. . Tal vez Nick o uno de los otros empleados de Google pueden pesar en

Por ahora, he aquí una solución hacky:

  • Encienda el acceso federado para su aplicación
  • asegurarse de que está pasando save_cookies = True cuando llamando remote_api_stub.ConfigureRemoteDatastore para su escritura de la consola
  • autenticación de la consola
  • intento y obtener el error 302
  • registrado como administrador a través de la interfaz web de su aplicación
  • En su cookies del navegador, la cookie encuentran ACSID para myapp.appspot.com
  • buscar y editar su archivo ~/.appcfg_cookies locales
  • Reemplazar la cookie ACSID para myapp.appspot.com con el de su navegador

La próxima vez que intente utilizar remote_api, debería funcionar sin pedir credenciales. Sin embargo, deberá repetir los últimos 4 pasos cada vez que caduque la cookie. Puede reducir la caducidad de 1 día a hasta 2 semanas en la consola de administración para minimizar la molestia. ¡Que te diviertas!

+0

Hay una solución hacky - Pronto estaré blogueando al respecto. Sin embargo, aún no lo tengo todo unido. :/ –

+0

Respuesta impresionante - aplaude a Drew. Funciona perfectamente :) Para otros, necesita estructurar su cookie de acuerdo con el formato de cookie netscape. Es una sola línea de texto por cookie: una serie de tokens separados por pestañas. Lo siguiente funcionó para mí ' .appspot.com FALSE/FALSE ' - sección 3.5 aquí - http://www.cookiecentral.com/faq/ da un ejemplo. Tenga en cuenta que no puse el líder '.' y tenía FALSO en lugar de VERDADERO en comparación con el ejemplo. Además, la cadena de cookies ACSID real es mucho más larga. Gracias de nuevo. – hawkett

+0

Buena respuesta. también puede volver a las cuentas de Google, si no está usando la funcionalidad OpenId, como yo. :) –

3

Esto definitivamente es un problema ... marque su interés en hacer que Google solucione esto, marcando el boleto en http://code.google.com/p/googleappengine/issues/detail?id=3258 y no dude en agregar cualquiera de sus soluciones allí.

En una nota relacionada, también reconocemos que los documentos son algo escasa, por lo que estoy trabajando en un artículo que se espera llena en algunos de esos agujeros ... estad atentos y mantener los ojos abiertos en http://code.google.com/appengine/articles

2

Aquí está a workaround you can use hasta que haya una solución más permanente en su lugar.

+0

Genial - gracias Nick. – hawkett

+0

@Nick Esto parece ser específico de Python. ¿Ha surgido una solución permanente y hay una para Java? – HRJ