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!
Hay una solución hacky - Pronto estaré blogueando al respecto. Sin embargo, aún no lo tengo todo unido. :/ –
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
Buena respuesta. también puede volver a las cuentas de Google, si no está usando la funcionalidad OpenId, como yo. :) –