javascript - tokens - node js secure rest api
¿Asegurando la API REST de mi aplicación Node.js? (3)
Podría ayudar con mi API REST. Estoy escribiendo una aplicación Node.js que está utilizando Express, MongoDB y tiene Backbone.js en el lado del cliente. He pasado los últimos dos días tratando de resolver todo esto y no haber tenido mucha suerte. Ya he revisado:
- Asegurar una API REST
- Asegurando mi API REST con OAuth mientras sigo permitiendo la autenticación a través de proveedores externos de OAuth (usando DotNetOpenAuth)
- http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
- http://tesoriere.com/2011/10/10/node.js-getting-oauth-up-and-working-using-express.js-and-railway.js/
Quiero mantener mi backend y frontend lo más separados posible, así que pensé en usar una API REST cuidadosamente diseñada, sería bueno. Mi idea es que si alguna vez me topo para desarrollar una aplicación de iPhone (o algo similar), podría usar la API para acceder a los datos.
PERO, quiero que esto sea seguro. Un usuario ha iniciado sesión en mi aplicación web y quiero asegurarme de que mi API sea segura. Leí acerca de OAuth, OAuth 2.0, OpenID, Hmac, hashes, etc. ... Quiero evitar el uso del registro externo (Facebook / Twitter / etc) Quiero que el registro y el inicio de sesión se realicen en mi aplicación / servidor.
... pero todavía estoy confundido aquí. Tal vez sea tarde por la noche o mi cerebro esté solo frito, pero realmente podría hacer algunos pasos sobre qué hacer aquí. ¿Cuáles son los pasos para crear una API segura?
Cualquier ayuda, cualquier información, cualquier ejemplo, pasos o cualquier cosa sería genial. ¡Por favor ayuda!
Aquí hay una forma diferente de pensar al respecto:
Supongamos por un momento que no estás usando una API. El usuario inicia sesión en la aplicación, proporciona algunas credenciales y le entrega al usuario una cookie o señal similar, que usted usa para identificar que el usuario ha iniciado sesión. El usuario luego solicita una página que contiene información restringida (o creando / modificándolo / eliminándolo), entonces usted verifica que este token se asegure de que el usuario pueda ver esa información.
Ahora, me parece que lo único que está cambiando aquí es la forma en que se entrega la información. En lugar de entregar la información como HTML procesado, está devolviendo la información como JSON y presentándola en el lado del cliente. Sus solicitudes de AJAX para el servidor llevarán el mismo token de inicio de sesión que antes, por lo que le sugiero que solo verifique ese token y restrinja la información a ''lo que el usuario puede saber'' de la misma manera.
Su API ahora es tan segura como su inicio de sesión. Si alguien conociera el token necesario para acceder a la API, también estaría conectado al sitio y tendrá acceso a toda la información de todos modos. Lo mejor es que si ya ha implementado el inicio de sesión, realmente no ha tenido que trabajar más.
El objetivo de los sistemas como OAuth es proporcionar este método de "inicio de sesión", generalmente de una aplicación de terceros y como desarrollador. Esta podría ser una buena solución para una aplicación de iPhone o similar, pero eso es en el futuro. ¡No hay nada de malo en que la API acepte más de un método de autenticación!
Las respuestas hasta ahora hacen un gran trabajo de explicación, pero no dan ningún paso real. Me encontré con esta publicación de blog que detalla detalladamente cómo crear y administrar tokens de forma segura con Node + Passport.
http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb/
Para aumentar la seguridad / complejidad:
Basic HTTP Auth
Muchas bibliotecas API le permitirán construir esto (por ejemplo, Piston en Django) o puede dejar que su servidor web lo maneje. Tanto Nginx como Apache pueden usar directivas de servidor para proteger un sitio con una contraseña simple codificada en b64. No es la cosa más segura en el mundo, pero al menos es un nombre de usuario y contraseña.
Si está usando Nginx, puede agregar una sección a su configuración de host de esta manera:
auth_basic "Restricted";
auth_basic_user_file /path/to/htpasswd;
(Ponlo en tu location /
bloque)
Documentos: http://wiki.nginx.org/HttpAuthBasicModule
Necesitará obtener el script de Python para generar esa contraseña y poner el resultado en un archivo: http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py?format=txt
La ubicación del archivo no importa demasiado, siempre y cuando Nginx tenga acceso a ella.
HTTPS
Asegure la conexión de su servidor a la aplicación, este es el más básico y evitará que el hombre en el medio ataque.
Puedes hacer esto con Nginx, los documentos son muy completos: http://wiki.nginx.org/HttpSslModule
Un certificado autofirmado para esto estaría bien (¡y gratis!).
Claves de API
Estos pueden tener el formato que desee pero le dan la ventaja de revocar el acceso en caso de que lo necesite. Posiblemente no sea la solución perfecta para ti si estás desarrollando ambos extremos de la conexión. Suelen usarse cuando tienes terceros que usan la API, por ejemplo, Github.
OAuth
OAuth 2.0 es el indicado aquí. Si bien no conozco el funcionamiento subyacente de la especificación, es el estándar de facto para la mayoría de la autenticación ahora (Twitter, Facebook, Google, etc.) y hay un montón de bibliotecas y documentos para ayudarlo a implementarlos. Dicho esto, generalmente se utiliza para autenticar a un usuario solicitando la autenticación a un servicio de terceros.
Teniendo en cuenta que el desarrollo de ambos extremos probablemente sea suficiente para poner su API detrás de la autenticación HTTP básica y servirlo a través de HTTPS, especialmente si no quiere perder tiempo jugando con OAuth.