Nuestro producto registra nuevos jugadores en nuestro servicio, y hemos elegido alojarlo en Azure (estamos usando .NET) y queríamos que no tuviera estado (por escalabilidad) y relativamente seguro.
Dado que este es el primer REST WS que estoy escribiendo, quería obtener algunos comentarios sobre si es una solución sólida o no.
Algunas presunciones para saber sobre nuestra aplicación:
- Los usuarios inician sesión en el servicio de forma anónima, sin requerir una contraseña de un usuario
- El WS debe estar completamente sin estado para permitir el escalado horizontal
- Nos estamos conectando usando HTTPS (SSL) para evitar la intromisión de terceros
EDITAR:
- Apuntamos a dispositivos iOS / Android nativos
- Nuestra principal preocupación es asegurarnos de que solo los clientes no manipulados puedan enviar solicitudes
Y el proceso de autenticación abstracta:
- El cliente crea un hash simple (UDID: Timestamp) y lo encripta usando la marca de tiempo con algún algoritmo básico (por ejemplo, la clave secreta es cada segundo carácter del hash)
- El cliente envía su UDID, marca de tiempo y hash al servidor
- El servidor reconstruye el hash y descifra el hash cifrado enviado por el usuario
- Si los dos son iguales, sabemos que en realidad fue enviado desde nuestro cliente (y con suerte no desde un remitente malicioso)
Cualquier entrada / sugerencia sería genial, obviamente, ya que es la primera vez que manejo este problema, podría haberlo diseñado incorrectamente.
¡Gracias!
2da actualización:
Al leer las especificaciones de seguridad para OAuth, parece que no hay una respuesta real a mi pregunta, ya que el cliente y el servidor deben conocer las claves secretas y el cliente se almacena localmente en los dispositivos móviles de nuestros usuarios (en lugar de una aplicación web).
De la guía de seguridad de OAuth ( http://hueniverse.com/oauth/guide/security/ ):
Al implementar OAuth, es fundamental comprender las limitaciones de los secretos compartidos, simétricos o asimétricos. El secreto del cliente (o clave privada) se utiliza para verificar la identidad del cliente por parte del servidor. En el caso de un cliente basado en la web, como un servidor web, es relativamente fácil mantener el secreto del cliente (o clave privada) confidencial.
Sin embargo, cuando el cliente es una aplicación de escritorio, una aplicación móvil o cualquier otro software del lado del cliente, como applets del navegador (Flash, Java, Silverlight) y scripts (JavaScript), las credenciales del cliente deben incluirse en cada copia de la aplicación . Esto significa que el secreto del cliente (o la clave privada) debe distribuirse con la aplicación, lo que los compromete de forma heredada.
Esto no impide el uso de OAuth dentro de dicha aplicación, pero limita la cantidad de confianza que el servidor puede tener en tales secretos públicos. Dado que no se puede confiar en los secretos, el servidor debe tratar dicha aplicación como entidades desconocidas y usar la identidad del cliente solo para actividades que no requieren ningún nivel de confianza, como la recopilación de estadísticas sobre las aplicaciones. Algunos servidores pueden optar por prohibir dicha aplicación u ofrecer diferentes protocolos o extensiones. Sin embargo, en este punto no existe una solución conocida para esta limitación.