Escenario: Diseño una API REST donde los usuarios autenticados pueden acceder a la API a través de TLS. Tengo que usar TLS ya que los datos transmitidos a través del cable son confidenciales. No necesito autorización en este momento, pero no quiero excluir la posibilidad. Quiero usar algún tipo de método de clave API (/ Secreto). Preferiría evitar el uso de OAuth. Tengo dos soluciones posibles. En ambos casos, la clave de API (y el secreto) será generada por nosotros.
I. Clave API simple
Incluir una clave API en el encabezado HTTP, puedo autenticar al cliente según ese encabezado. La clave API es segura, debido a TLS. Los ataques de repetición no son posibles, garantizados también por TLS. Muy simple de implementar por nuestros clientes. Por lo que entiendo de TLS, la solicitud no puede ser manipulada (MAC). Todas las medidas de seguridad son proporcionadas por TLS. El cliente solo agrega el encabezado HTTP de la clave API.
II. Firma HMAC con un secreto API
La solicitud debe incluir una firma, con el secreto, la marca de tiempo y el hash de la carga útil de la solicitud. Ahora no se puede manipular ni reproducir y el secreto ni siquiera se transmite por el cable. Más seguro, pero difícil de implementar en el lado del cliente. (escribir bibliotecas de clientes no es una opción)
¿La primera solución representa una amenaza y proporciona suficiente seguridad a mis clientes (y a nuestra API), o debería usar la segunda más complicada? Además, ¿cuáles son las deficiencias de la primera?