Actualmente estoy trabajando en una biblioteca REST para .net, y me gustaría escuchar algunas opiniones sobre un punto abierto que tengo: REST y autenticación.REST y variantes de autenticación
Aquí es un ejemplo de una interfaz REST se utiliza con la biblioteca:
[RestRoot("/user")]
public interface IUserInterface
{
[RestPut("/")]
void Add(User user);
[RestGet("/")]
int[] List();
[RestGet("/get/{id}")]
User Get(int id);
[RestDelete("/delete/{id}")]
void Delete(int id);
}
El código del servidor a continuación, sólo implementa la interfaz y los clientes pueden obtener la misma interfaz a través de una fábrica. O si el cliente no está usando la biblioteca, una solicitud HTTP estándar también funciona.
Sé que existen las principales formas de utilizar HTTP Basic Auth o enviar un token a las solicitudes que requieren usuarios autenticados.
El primer método (autenticación básica de HTTP), tiene las siguientes cuestiones (en parte navegador web específico):
- La contraseña se transmite con cada petición - incluso con SSL esto tiene algún tipo de "mal rollo" .
- Dado que la contraseña se transmite con un encabezado de solicitud, sería fácil para un atacante local mirar los encabezados transmitidos para obtener la contraseña.
- La contraseña está disponible en la memoria de los navegadores.
- No hay forma estándar de caducar "sesiones" de usuario.
- Iniciar sesión con un navegador interrumpe la apariencia de una página.
Los temas para el segundo método se centran más en la implementación y uso de la biblioteca:
- Cada petición URI que necesita la autenticación debe tener un parámetro de la señal, la cual es muy repetitivo.
- Hay mucho más código por escribir si cada implementación de método necesita verificar si un token es válido.
- La interfaz será menos específica, p.
[RestGet("/get/{id}")]
contra[RestGet("/get/{id}/{token}")]
. - Dónde colocar el token: al final del URI? después de la raíz? ¿en algún otro lugar?
Mi idea era pasar el token como parámetro a la URL como http:/server/user/get/1234?token=token_id
.
Otra posibilidad sería enviar el parámetro como un encabezado HTTP, pero supongo que complicaría el uso con clientes HTTP simples.
El token se volvería a pasar al cliente como un encabezado HTTP personalizado ("X-Session-Id") en cada solicitud.
Esto podría ser completamente abstraído de la interfaz, y cualquier implementación que necesite autenticación podría simplemente preguntar a qué usuario pertenece el token (si se le dio).
¿Crees que esto violaría demasiado el REST o ¿tienes alguna idea mejor?
Gracias por el enlace S3. – Fionn
En el ejemplo S3, comparten claves criptográficas con clientes: esto es malo, ¿o no? –
Como cualquier tipo de criptografía secreta compartida, es esencial que ambas partes mantengan el secreto de la clave. En ese sentido, no es peor que la criptografía simétrica. – laz