2011-11-09 8 views
15

He tenido este servidor REST (escrito por mí mismo) que está protegido por autenticación HTTP simple.Acceso seguro al servidor REST autenticado a través de Backbone.js?

Ahora reescribí la aplicación usando backbone.js y no estoy seguro de cómo autenticar a mi cliente. Si lo hago en JS user/pass sería visible.

Entonces, ¿cómo debo modificar mi servidor o mi lado del cliente JS para estar seguro?

Anteriormente acabo de dar al usuario & pase en PHP para cada solicitud al servidor REST, por favor guíame, Gracias.

Respuesta

2

bien tuve una discusión con mi colega y se acercó con la mejor idea hasta el momento:

Hacer un controlador simple en el lado del cliente (sitio) y el nombre como RESTAPI, se acaba de actuar como un contenedor a su servidor descanso efectivo.

Cuando un usuario entra en su sitio, su sesión de se crean. El controlador RESTAPI conoce las credenciales de su servidor REST real HTTP autenticado y accede al servidor REST en nombre de la red troncal.

Ejemplo: Si tengo a buscar

/mensajes/enviado

desde el reposo del servidor, ahora en lugar Voy a golpear esta url en la recolección de la columna vertebral

sitio/restapi/mensajes/enviados

RESTAPI Con Troller también verifica primero que el usuario solicitante tenga una sesión adecuada en el sitio y el tiempo en que puede buscar el recurso o no.

Así que no se preocupa por las cookies inseguras o salir de su pase servidor REST en la llanura JS o utilizando cualquier otro método oscura :)

+1

¿No es ese tipo de ruptura la RESTOSIDAD total del servidor? Quiero decir que si vas a ir por esa ruta también puedes hacer el manejo de la sesión en el servidor. No me malinterprete, todavía estoy en la oscuridad sobre si paso credenciales cada vez, almacenarlas en el cliente para aprobar cada vez no es necesariamente la mejor idea. – thenetimp

+0

No hay nada de malo en pasar credenciales en cada solicitud. En REST, cada solicitud debe ser autodescriptiva (para eliminar la necesidad de sesiones en el servidor).Si un recurso está protegido, las credenciales forman parte de la "descripción" de la solicitud y, como tal, deben enviarse con ella. Puede simplemente pedirle sus credenciales al usuario y pasarlas en cada solicitud posterior. Para OP, no use sesiones, por favor. Estás destruyendo la belleza REST con ella. No necesitas sesiones y al no usarlas, mantienes tu sistema mucho más escalable. – miguelcobain

+0

¿Puede proporcionar un ejemplo del código backbone.js que escribió para esta implementación? Estoy teniendo un problema para que funcione. Puedes ver mi progreso en [esta pregunta] (http://stackoverflow.com/questions/14752326/adding-http-basic-authentication-header-to-backbone-js-sync-function-prevents-mo) – MusikPolice

29

La autenticación HTTP básica es propensa a los ataques de espionaje y de hombre en el medio. Se recomienda usar HTTPS.

Sin embargo, si no es una opción, siempre puede enviar una cookie al cliente y tener el nombre de usuario/contraseña ingresados ​​allí para evitar que se muestre en el archivo JS. Huelga decir que la contraseña al menos debe ser encriptada/hash por razones de seguridad. Luego, la responsabilidad estará en el lado del servidor para obtener los detalles de autenticación de la cookie.

Ahora, si no tiene ningún control sobre la modificación del código del lado del servidor, prácticamente no tiene más opción que enterrar los detalles de la credencial en un método global ajaxSend() que enviará los detalles de nombre de usuario/contraseña con cada Solicitud de AJAX Podrías poner esto en otro archivo .js y hacerlo difícil de encontrar, pero estás más o menos restringido a esa forma de seguridad. Aunque, las cookies no hacen su vida más segura. (Sería bueno si la contraseña es hash/encriptada).

La otra cosa que podría hacer es tener una forma de seguridad un poco más complicada: haga que el servidor envíe una copia de seguridad con cada respuesta: el servidor 'firmará' el servidor usando la clave secreta del servidor y podrá Úselo para 'encriptar' el nombre de usuario/contraseña en el lado del cliente para cada solicitud. Su servidor tendría que descifrar constantemente las credenciales. Esto es menos propenso a man-in-the-middle pero aún no es infalible.

HTTPS le ahorraría cada una de las opciones anteriores si es una opción para usted.

Espero que esto ayude.

ACTUALIZACIÓN(según el comentario): La esencia del reparador-dad es la ausencia de estado en el servidor. Es decir, ¡sin sesiones! Por lo tanto, debe enviar las credenciales de usuario con CADA solicitud que el cliente haga del servidor. Si tiene una página de inicio de sesión, entonces es muy difícil estar realmente tranquilo ya que no hay un 'recurso' llamado inicio de sesión. Sin embargo, esto es lo que puede hacer:

  1. usuario visita la página de inicio de sesión, introduce las credenciales y los clics 'login' solicitud POST
  2. Enviar al servidor con estas credenciales - probablemente a/Login
  3. Haga que el servidor devuelve la recurso solicitado para el que se necesitó autenticación Y establecer la cookie con las credenciales válidas para usar en la solicitud 'siguiente'
  4. Cada solicitud posterior será dirigida al recurso correspondiente en una URL particular con una acción particular (GET, PUT, POST , BORRAR...). El servidor debe verificar los datos de autenticación de la cookie y decidir si el usuario está autenticado y realizar una autorización adicional para otorgar acceso si es necesario.

Cada solicitud deberá identificarse a sí mismo sin tener el servidor de mantenimiento de la sesión - que es el espíritu de la apatridia (y-dad reparador;)

+0

Gracias por visión en profundidad y que sin duda ayuda. Pero, lo siento, olvidé mencionar (pregunta editada ahora) que tengo acceso completo al servidor y puedo cambiarlo para que mi configuración sea infalible. Alguna sugerencia sobre eso? Puede escribir otra respuesta o editarla si lo desea. – BlackDivine

+1

@BlackDivine - tienen los mismos pasos :) he demostrado 3 maneras de hacerlo - único cliente ('ajaxSend'), sólo el servidor (cookie) e híbridos (cifrar constante/descifrar usando nonce servidor) – PhD

+0

opción de cookies para más me gusta en este momento, ¿puede confirmar que este apporach es mejor? que creamos sesiones en el servidor, cada vez que un usuario inicia una sesión con éxito en, la sesión se crea en el servidor de descanso y el tiempo que la sesión está vivo el usuario puede utilizar la API REST. ¿Ahora el envío del POST de inicio de sesión a través de ajax creará una sesión para el usuario en el servidor o en mi sitio web? Como tengo 2 servidores, 1 es REST el otro sitio web de hosts que ejecuta la aplicación principal. ¡Muchas gracias! – BlackDivine

0

Si tiene acceso al servidor de código RESTO lado, puede rediseñar la autenticación RESTO. La primera vez, para iniciar sesión, publica el nombre de usuario/contraseña en https, a su vez obtiene una identificación de la sesión que se puede usar en solicitudes posteriores pasándola como cookie.

Cuestiones relacionadas