Supongamos que tengo una aplicación iOS / Android que se basa en una API REST personalizada para cosas como la administración de cuentas (registro, inicio de sesión, restablecimiento de contraseña, obtención / configuración de datos relacionados con el usuario).
No hay una buena manera de garantizar que solo se llame a mi API desde mi aplicación móvil. Oauth2 y similares con 'secreto' en el código del cliente pueden ser fácilmente diseñados por ingeniería inversa.
Digamos que tengo una llamada a la API como esta:
enlace
Esto crea un nuevo usuario y, a partir de ese momento, todas las llamadas a la API incluirán un token de sesión o algo que vincule la llamada a la API con un usuario específico de la aplicación.
Esta primera llamada de registro es la única que no está protegida por nada y lo que me preocupa es que una persona maliciosa la llame 1.000.000 veces desde un script de PC para crear muchos usuarios falsos, especialmente con direcciones de correo electrónico reales. Entonces, las personas con estas direcciones no podrán utilizar la aplicación.
¿Cómo puedo proteger esa primera llamada a la API para evitar el uso indebido masivo? Estoy pensando en incluir un CAPTCHA compatible con dispositivos móviles validado por el servidor en el formulario de registro de usuario.
Nuevamente, todas las llamadas API subsiguientes están protegidas con token de sesión y el conteo de llamadas API monitoreado por usuario (las sospechosas están bloqueadas).
Se trata de diseñar la API de tal manera que incluso si se usa desde un cliente intrínsecamente inseguro como un teléfono móvil, todavía está bien. Básicamente, incluso si la API se hiciera completamente pública, nadie podría hacer mucho mal. Así que aquí la pregunta se centra en proteger esa primera llamada a la API, pero también se trata de resolver un problema más general.
Parece que otras alternativas interesantes incluyen el uso de la validación de correo electrónico o un proveedor sólido de identidad de terceros como Google y similares. Ninguna de estas 3 opciones es perfecta. De todos modos, interesado en la discusión en torno a este tema.
¿Eso tiene sentido? ¿Estoy complicando demasiado las cosas?