Estoy desarrollando la aplicación web restful que usa un marco web popular en el backend, digamos (rails, sinatra, flask, express.js). Idealmente, quiero desarrollar el lado del cliente con Backbone.js. ¿Cómo dejo que solo mi lado del cliente javascript interactúe con esas llamadas a la API? No quiero que esas llamadas a la API sean públicas y las llame curl
o simplemente ingrese el enlace en el navegador.
91
Respuestas:
Como primer principio, si su cliente JS consume su API, debe asumir que es pública: un depurador JS simple pone a un atacante en una posición en la que puede enviar una solicitud idéntica byte por byte desde un herramienta de su elección.
Dicho esto, si leí tu pregunta correctamente, esto no es lo que quieres evitar: lo que realmente no quieres que suceda es que tu API se consuma (de forma regular) sin que tu cliente JS esté involucrado. Aquí hay algunas ideas sobre cómo, si no hacer cumplir, al menos fomentar el uso de su cliente:
Estoy seguro de que su API tiene algún tipo de campo de autenticación (por ejemplo, Hash calculado en el cliente). Si no, eche un vistazo a esta pregunta SO . Asegúrese de usar una sal (o incluso una clave API) que se le da a su cliente JS por sesión (no codificada). De esta manera, un consumidor no autorizado de su API se ve obligado a trabajar mucho más.
Al cargar el cliente JS, recuerde algunos encabezados HTTP (me viene a la mente el agente de usuario) y la dirección IP y solicite una nueva autenticación si cambian, empleando listas negras para los sospechosos habituales. Esto obliga al atacante a volver a hacer su tarea más a fondo.
En el lado del servidor, recuerde las últimas llamadas a la API y, antes de permitir otra, verifique si la lógica empresarial permite la nueva en este momento: esto le niega a un atacante la capacidad de concentrar muchas de sus sesiones en una sesión con su servidor: En En combinación con las otras medidas, esto hará que un abusador sea fácilmente detectable.
Puede que no haya dicho eso con la claridad necesaria: considero imposible hacer que sea completamente imposible que un abusador consuma su servicio, pero puede hacerlo tan difícil que tal vez no valga la pena.
fuente
Debería implementar algún tipo de sistema de autenticación. Una buena forma de manejar esto es definir algunas variables de encabezado esperadas. Por ejemplo, puede tener una llamada API de autenticación / inicio de sesión que devuelva un token de sesión. Las llamadas posteriores a su API esperarán que se establezca un token de sesión en una variable de encabezado HTTP con un nombre específico como 'your-api-token'.
Alternativamente, muchos sistemas crean tokens de acceso o claves que se esperan (como youtube, facebook o twitter) usando algún tipo de sistema de cuentas api. En esos casos, su cliente tendría que almacenarlos de alguna manera en el cliente.
Entonces es simplemente una cuestión de agregar una verificación para la sesión en su marco REST y lanzar una excepción. Si es posible, el código de estado (estar tranquilo) sería un error 401.
fuente
Ahora hay un estándar abierto llamado "JSON Web Token",
ver https://jwt.io/ y https://en.wikipedia.org/wiki/JSON_Web_Token
fuente
Disculpe @MarkAmery y Eugene, pero eso es incorrecto.
Su aplicación js + html (cliente) que se ejecuta en el navegador PUEDE configurarse para excluir llamadas directas no autorizadas a la API de la siguiente manera:
Durante la autenticación se devuelve un "token".
Después de la autenticación, solo se aceptarán las llamadas a la API con el "token" de autenticación.
Por supuesto, en esta etapa solo los usuarios autorizados que tienen la contraseña pueden acceder a la API, aunque si son programadores que están depurando la aplicación, pueden acceder a ella directamente con fines de prueba.
Ahora, para usar su API, primero deben descargar el cliente y ejecutarlo en un navegador. Solo después de recibir con éxito la devolución de llamada, y luego de la entrada del usuario en un corto período de tiempo, la API aceptará llamadas.
Por lo tanto, no tiene que preocuparse de que se trate de un usuario no autorizado sin credenciales.
(El título de la pregunta, '¿Cómo puedo asegurar las llamadas a la API REST?', Y de la mayor parte de lo que dice, esa es su principal preocupación, y no la pregunta literal de CÓMO se llama su API, sino POR QUIÉN, ¿correcto? )
fuente
Establezca una var SESSION en el servidor cuando el cliente cargue por primera vez su
index.html
(obackbone.js
etc.)Verifique esta var en el lado del servidor en cada llamada a la API.
PD: esta no es una solución de "seguridad" !!! Esto es solo para aliviar la carga en su servidor para que las personas no abusen de él o "enlacen" su API desde otros sitios web y aplicaciones.
fuente
Esto es lo que hago:
Asegure la API con un encabezado HTTP con llamadas como X-APITOKEN:
Utilice variables de sesión en PHP. Disponga de un sistema de inicio de sesión y guarde el token de usuario en las variables de sesión.
Llame al código JS con Ajax a PHP y use la variable de sesión con curl para llamar a la API. De esa manera, si la variable de sesión no está configurada, no llamará y el código PHP contiene el token de acceso a la API.
fuente