Cómo hacer que mis servicios web alojados sean accesibles solo desde mi aplicación de Android

Lo que estás haciendo es una forma de DRM. Cuando la aplicación cliente tiene la capacidad de acceder a la API, y el atacante puede tener en sus manos la aplicación cliente, el atacante puede aprender lo que haga la aplicación cliente para acceder a la API. No hay forma posible de prevenirlo por completo. Pero hay formas de mitigar el problema.

Tener un secreto o certificado de cliente puede elevar un poco el listón, pero cualquier persona con su aplicación puede desmontarlo y extraer el secreto o certificado, en cuyo caso podrán simular la aplicación. También puede enviar actualizaciones que cambien el secreto y obliguen a sus usuarios a actualizar, lo que obliga a otras aplicaciones copycat a actualizar. Pero eso molestará a sus usuarios.

Probablemente el mejor enfoque es integrarse con la suscripción de Google / API IAP [1] si está cobrando por su aplicación. Si no está cobrando, puede usar la API de autenticación de Google para verificar que realmente exista un usuario en particular y solicitar un inicio de sesión en su aplicación. Si usa OAuth, al menos debería poder controlar la página de inicio de sesión, por lo que si alguien más intentara usar su API, la página mostraría el nombre de su aplicación en lugar del suyo.

Entonces necesitaría limitar a cada usuario a una cantidad razonable de uso para un solo usuario. De lo contrario, un actor malintencionado podría seguir el proceso de comprar una sola copia de su aplicación, iniciar sesión y luego extraer credenciales válidas que podrían usar con su API.

Puedes subir mucho el listón y puedes limitar el daño. Pero no es posible evitar por completo que alguien use su API.

Notas al pie

[1] API de desarrollador de Google Play

De hecho, estoy mirando hacer algo similar.

Estaba considerando usar certificados del lado del cliente para bloquear el acceso a dispositivos específicos. De esta manera, el tráfico se cifra y el dispositivo debe autenticarse en el servidor web.

Estaría ejecutando una CA para tener mi propio certificado ‘root’ para mi organización de todos modos, por lo que emitir y agregar certificados adicionales no es un problema.

Sin embargo, aún no he investigado los requisitos / detalles al respecto.

Si la aplicación proporciona toda la interfaz de usuario, en el caso más simple, puede usar la autenticación básica a través de HTTP / SSL (“https”) y realizar solicitudes desde la aplicación a la lógica del lado del servidor que a su vez accede a una base de datos y devuelve información para representar o de otra manera guiarse por. No habría páginas web en absoluto.

Para hacer eso, debe diseñar algún tipo de mecanismo que contendrá una información única en el servicio web y en la aplicación, luego, si alguien intenta conectarse a su servicio, no tendrá la clave única y no poder acceder al servicio web.

Si está utilizando una autenticación basada en token, puede agregar un requisito a cada solicitud de que se debe pasar un client_secret, y si el client_secret de la aplicación móvil coincide, entonces está listo.