services practices best rest authentication http-headers authorization rest-security

practices - Autorizar solicitudes de REST



rest basic authentication (4)

Estoy trabajando en un servicio REST que tiene algunos requisitos:

  1. Tiene que ser seguro.
  2. Los usuarios no deberían poder forjar las solicitudes.

Mi solución actual propuesta es tener un encabezado de Autorización personalizado que se vea así (esta es la misma manera que funcionan los servicios web de Amazon):

Authorization: MYAPI username:signature

Mi pregunta es cómo formar la firma. Cuando el usuario inicia sesión en el servicio, recibe una clave secreta que debe poder usar para firmar las solicitudes. Esto detendrá a otros usuarios que envían solicitudes en su nombre, pero no impedirá que falsifiquen solicitudes.

La aplicación que usará este servicio es una aplicación de iPhone, así que pensé que podríamos tener una clave pública integrada en la aplicación con la que podemos hacer una firma adicional, pero ¿esto significa que tendremos que tener dos firmas, una para la clave del usuario y otra para la clave de la aplicación?

Cualquier consejo sería muy apreciado, me gustaría hacerlo bien la primera vez.



La respuesta es simple: no se puede hacer. Tan pronto como envía una solución al usuario final, él o ella siempre puede atacar el servidor con el que se está comunicando. La versión más común de este problema es hacer trampa con listas de alto puntaje en los juegos Flash. Puede hacer que sea más difícil al incorporar algún tipo de encriptación en el cliente y ofuscar el código ... Pero todo código compilado y oculto puede ser decompilado y no confundido. Es solo una cuestión de cuánto tiempo y dinero está dispuesto a gastar y también para el atacante potencial.

Entonces, su preocupación no es cómo tratar de evitar que el usuario envíe datos defectuosos a su sistema. Es cómo evitar que el usuario dañe su sistema. Debe diseñar sus interfaces para que todo el daño causado por datos defectuosos solo afecte al usuario que lo envía.


Creo que la forma más sencilla de hacerlo bien sería utilizar la autenticación de cliente HTTPS. El sitio de Apple tiene un hilo en este mismo tema.

Editar: para manejar la autorización, crearía un recurso separado (URI) en el servidor para cada usuario, y solo permitiría que ese usuario (autenticado) manipule este recurso.

Editar (2014): Apple cambió su software de foro en los últimos seis años; el hilo está ahora en https://discussions.apple.com/thread/1643618