Estoy construyendo una aplicación web basada en Pylons con RESTful API, que actualmente carece de autenticación. Así que voy a implementar eso y para evitar todos los problemas y precauciones al almacenar las contraseñas de los usuarios, me gustaría utilizar OpenID para la autenticación. Cuál sería la mejor forma de hacer esto? ¿Son estas dos cosas compatibles? ¿Existen API REST existentes que utilicen OpenID de las que pueda inspirarme?¿Cómo se usa OpenID en la API RESTful?
Respuesta
Ahora he pasado un tiempo investigando las opciones y me gustaría resumir los hallazgos. Primero, un poco más de contexto: desarrollo y control tanto el servicio como el consumidor API. El consumidor es una aplicación basada en Flash que se sirve desde el mismo host que la API ahora y se supone que debe usarse en el navegador. No hay clientes de terceros a la vista todavía.
Así que la pregunta se puede dividir en dos partes,
- cómo hago la autenticación OpenID través de la API
- ¿Cómo se mantiene el estado "autenticado" en las solicitudes posteriores
Para la primera parte, la autenticación OpenID casi siempre incluye pasos interactivos. Durante el proceso de autenticación, probablemente habrá un paso en el que el usuario se encuentre en la página web del proveedor de OpenID, iniciando sesión y presionando el botón "Acepto". Así que la API no puede y no debe manejar esto de forma transparente (no "dígame su proveedor de OpenID y contraseña y yo me ocuparé del resto"). Lo mejor que puede hacer es pasar y retroceder los enlaces HTTP que el cliente debe abrir y seguir las instrucciones.
El mantenimiento "autenticados"
API REST estatales deben ser sin estado, cada solicitud debe incluir toda la información necesaria para manejar la situación, ¿verdad? No tendría sentido autenticarse contra el proveedor de OpenID para cada solicitud, por lo que tipo de sesión es necesario. Algunas de las opciones para comunicar clave de sesión (o "token de acceso" o nombre de usuario/contraseña) son:
- HTTPS + autenticación básica ("Autorización: básicos ..." de cabecera en cada solicitud)
- peticiones de firma Amazon-style ("Autorización: AWS ..." encabezado en cada solicitud)
- OAuth: adquirir acceso de emergencia, que incluya y un montón de otros parámetros en cada solicitud
- cookie que almacena la clave de sesión ("cookie: ... "encabezado en cada solicitud)
- Cookie firmada que almacena información de la sesión en la misma cookie
En este momento hay solo un consumidor de API, por lo que opté por lo más simple que podría funcionar: cookies.Son súper fáciles de usar en Pilones, con la ayuda de Beaker. También "simplemente funcionan" en la aplicación Flash: dado que se ejecuta dentro del navegador, el navegador incluirá cookies relevantes en las solicitudes que realiza la aplicación Flash, la aplicación no necesita cambiarse en absoluto con respecto a eso. Aquí hay una pregunta de StackOverflow que también recomienda el uso de cookies: RESTful authentication for web applications
Beaker también tiene una bonita función de cookie-only sessions donde todos los datos de la sesión están contenidos en la cookie. Supongo que esto es tan apátrida como se pone. Hay no sesión almacenar en el servidor. Las cookies están firmadas y opcionalmente encriptadas para evitar manipularlas en el lado del cliente. El inconveniente es que la cookie se vuelve un poco más grande, ya que ahora necesita almacenar más que solo la clave de sesión. Al eliminar algunas cosas que realmente no necesitaba en la sesión (restos de la autenticación OpenID), reduje el tamaño de la cookie a unos 200 bytes.
OAuth es una mejor opción para el uso de API. Aquí hay un ejemplo de OAuth en uso en Python: oauth-python-twitter. La biblioteca python-oauth de Leah Culver es la implementación canónica de OAuth en Python, pero python-oauth2 es un contendiente reciente que está teniendo mucho revuelo. En cuanto a la inspiración, django-piston tiene soporte para usar OAuth para hacer auth al crear API RESTful para Django, aunque la documentación no es tan buena como me gustaría para ese tema en particular.
Si construye API, puede verificar el protocolo OAuth. Es complementario a OpenID.
- 1. Cómo integrar OpenID en la API web de MVC4
- 2. RESTful Zend Framework API
- 3. Restful API authentication recommendation?
- 4. Mimetypes para una API RESTful
- 5. ¿Cómo modelar una API RESTful con herencia?
- 6. ¿Cómo se implementa OpenID?
- 7. Consumir API RESTful con Java
- 8. RESTful JSON API Documentation Generator
- 9. CouchDB como la capa Restful API?
- 10. CherryPy y RESTful web api
- 11. Uso de URL limpias en API RESTful
- 12. RESTful sugerencias de claves API
- 13. ¿Qué solución OpenID realmente usa Stack Overflow?
- 14. ¿Cómo se usa google calendar api en android?
- 15. Cómo acceder a la API RESTful a través de PHP
- 16. ¿Tiene Netsuite una API RESTful?
- 17. Mejor API OpenId para la aplicación ASP.NET MVC
- 18. Nombre descriptivo de Google que usa OpenID?
- 19. ¿Cómo puedo implementar una API RESTful en Perl?
- 20. RESTful diseño de API con asociaciones
- 21. ¿Cómo proteger una clave API cuando se usa JavaScript?
- 22. Error de autenticación de señalización en una API RESTful
- 23. Sitio web Symfony2 y API RESTful
- 24. cómo utilizar openid en yii?
- 25. Consumir una API RESTful con Django
- 26. API RESTful para proyectos/aplicaciones Django
- 27. ¿Existe una API de Restful Blog
- 28. ¿Cómo establecer la columna de la base de datos como "dispersa" cuando se usa la API EF First Fluent API?
- 29. ¿Cómo implementar la aplicación web openId java?
- 30. ¿Cómo se usa `to_sql` en AREL cuando se usa` average() `?
Actualmente, la API está dirigida al escenario cliente-servidor. El cliente es una aplicación Flash y el servidor es la aplicación web Pylons. Actualmente no hay nada de servidor a servidor, por lo que no es necesario que tenga 3 patas. Mi problema actual es cómo introducir "usuarios autenticados" en el sistema sin tener que lidiar con el almacenamiento de contraseñas, el envío de recordatorios de contraseña, el restablecimiento de contraseñas, etc. No está claro de inmediato cómo OAuth me ayuda aquí, ya que en la versión de 2 patas solo especifica cómo firmar las solicitudes. –
En ese caso, tal vez una de las pastas en http://pylonshq.com/pasties/by_tag/openid ayudará. –