Proporcionar authentication segura de Facebook con mi server

Me gustaría build una pequeña aplicación mobile (Android e iOS) y un pequeño server backend con un REST Api.

Los usuarios de mi aplicación (Android o iOS) deben iniciar session en Facebook. Lo hago usando facebook mobile sdk. Cuando el inicio de session ha sido exitoso, facebook sdk devolverá una authenticationToken, que ahora está en el teléfono inteligente de los usuarios.

La idea es la siguiente: cada vez que mi aplicación necesita datos, la aplicación se comunicará con mi server backend (REST) ​​a través de HTTPS. Por ejemplo: la aplicación hace un HTTP GET simple y pasa la authenticationToken de Facebook recuperada. Mi server obtiene este facebook authenticationToken y usa este token para determinar, si el usuario está autenticado y para recuperar información del perfil de Facebook (nombre, apellido, etc.). Por lo tanto, el server también contacta con Facebook y genera la respuesta personalizada para la request HTTP GET.

Mis preguntas son:

  1. ¿Realmente es suficiente para pasar este token de authentication de facebook para cada llamada de API de REST, para que el server recupere el usuario de Facebook asociado correcto?
  2. Yo uso HTTPS, así que supongo que la connection está suficientemente encriptada, ¿verdad?
  3. Supongo que necesito algún mecanismo de firma, así que firma cada llamada a API REST (a través de HTTPS) para asegurarme de que el token de authentication Facebook se haya enviado solo desde mi aplicación mobile. Lo haría usando RSA con SHA-1 para firmar cualquier llamada REST API. Pero el problema con este enfoque es que el cliente necesita almacenar la key privada en algún lugar de la aplicación (para las requestes de firma) y el server conoce la key pública (para la coincidencia de firmas). ¿Es esto correcto? En caso afirmativo, creo que es un gran problema de security, ya que una aplicación mobile (especialmente Android) podría descomprimirse para get la key privada. ¿Cómo puedo almacenar esta key privada de forma segura en mi aplicación? ¿Hay otro sistema para firmar que puedas recomendar?

Bt: ¿Conoces una buena RSA lib para iOS y Android?

1) Sí. Es suficiente. Si su cliente (aplicación mobile) tiene un token, testing que un usuario se autentificó en Facebook. Entonces, autenticó a un usuario de esta manera. Sin embargo, no es suficiente autenticar una aplicación para dispositivos mobilees (sobre esto hablaré en el n. ° 3).

2) Sí. Está encriptado en ambos sentidos.

3) Eso es difícil. Se llama certificación remota. Hay MUCHOS problemas con esto.

Antes de entrar en esta dirección, debe hacerse dos preguntas

  • ¿A quién proteges?

  • ¿Cuánto estoy dispuesto a invertir?

Si se protege contra un estudiante con conocimientos muy limitados, quién puede escribir otra aplicación mobile que usará su server, entonces está bien con una firma.

Si está protegiendo contra un ingeniero de software un poco más sofisticado (que puede revertir la ingeniería de su aplicación), no será suficiente. Este ingeniero puede extraer una key privada de su aplicación y usarla para firmar requestes en su aplicación.

Puedes leer sobre la certificación remota aquí y aquí .

Las soluciones que pueden protegerlo de la simple ingeniería inversa son bastante complejas.

PD con respecto a la biblioteca RSA.

Mira esto para Android:

Crypto asimétrico en Android

Y esto para iOS

Cifrado RSA con key pública