Tengo una API que se comunica con mi cliente, ahora quiero asegurar esa API para que solo mi cliente pueda usarla. Estoy planeando hacer lo siguiente, ya que no tengo experiencia en esto, he reunido todo esto al leer sobre el tema y necesito consejos, aquí está mi flujo:
- Cuando un usuario inicia sesión en / registra, genera un token (por ejemplo: token = userId + date + radomvalue), guarda este token (hash) en un DBtable junto con userId.
- Enviar token (hash) al cliente, guardar en las preferencias para su uso posterior.
- Al llamar a la API, este token debe enviarse con la solicitud, en el servidor, revisamos nuestra tabla de tokens y vemos si encontramos la combinación de userId + hashedToken, si lo hacemos, se otorga el acceso.
Todas las comunicaciones son SSL, aquí están mis preguntas:
- ¿Qué debo hacer con el TTL en mis fichas? Y ¿qué pasa si al final obtengo 3 000 000 de usuarios, eso significa que cada llamada que hago a la API tiene que ver una tabla con 3 000 000 filas, ¿está bien?
- Obviamente no puedo hacer que mis puntos finales de inicio de sesión / registro requieran que se pase un token en la solicitud (ya que el cliente todavía no lo ha recibido), ¿está bien dejar estos "abiertos"?
- ¿Es correcto enviar sal + contraseña de texto sin formato a la api ya que está protegida por SSL, luego la hash en el lado del servidor?
EDITAR: 4. Pensando más en esto, ¿no podría alguien simplemente tomar su token de acceso del archivo de preferencias y hacer llamadas a mi API desde su propia aplicación, siempre que tienen el punto final y editan lo que quieran en su propio usuario?
Modelo de amenaza: estoy creando un juego. Tengo una base de datos donde guardo clasificación, experiencia, y también qué versión de juego tengo (gratis, sin publicidad, premium). Después de que alguien haga una compra, llamo a endpointService.setVersion("userId", "PREMIUM")
;. Este es el único activo de gran valor para mí, ya que no quiero que la gente edite eso por sí misma. Solo quiero proteger mis puntos finales, pero especialmente ese.