Forma segura de abrir una página web desde iOS sin necesidad de iniciar sesión

1

Estoy desarrollando una aplicación y una página web para iOS, ambas usan el mismo backend de Parse.

La página web contiene algunas funciones que no están disponibles en la aplicación iOS. Por lo tanto, me gustaría presentar al usuario una opción para abrir la página de inicio desde la aplicación. Como el usuario ya ha iniciado sesión antes en la aplicación, me gustaría omitir el proceso de inicio de sesión cuando se abre la página de inicio.

Tengo una solución en mi cabeza para la cual me gustaría conocer su opinión. Cuando el usuario hace clic en un enlace en la aplicación, la aplicación llamará, por ejemplo, La función generateToken en Parse, que crearía un token aleatorio, almacenaría su DB con alguna fecha de vencimiento para este usuario y la devolvería a la aplicación. La aplicación luego abriría la página web con el parámetro de consulta token = newly_generated_token o pasaría el valor del token en los encabezados http si eso se puede lograr.
En una nueva solicitud, el código del servidor verificará si existe el parámetro (o encabezado) token , verifique la db para el valor del token e inicie sesión en el usuario apropiado donde se encontraría la coincidencia. Posteriormente el token quedaría invalidado. Si la solicitud no contuviera ningún parámetro 'token', la autenticación habitual pasaría y se mostraría la página de inicio de sesión. Toda la comunicación sería sobre https.

Me deshago del ataque de reproducción al invalidar el token cuando se usa. ¿Es vulnerable a otros ataques? ¿O hay alguna otra forma de hacer esto?

Cualquier ayuda apreciada. Gracias!

    
pregunta tmin 09.06.2014 - 17:50
fuente

1 respuesta

2

El ataque de reproducción es solo una preocupación si está enviando el token a través de un mecanismo de texto simple (HTTP), en cuyo caso el contenido de la página también estaría disponible para el atacante. La técnica que ha descrito es el sonido, pero incluso puede hacerlo sin necesidad de escribir el DB. En el lado del servidor, simplemente puede calcular un HMAC a través de un ID de recurso único (ID de usuario si es uno por usuario) y un tiempo de caducidad. Al recibir este token, el servidor puede validarlo como legítimo y verificar que el token no haya caducado, luego presentar el contenido al usuario.

  1. La aplicación llama / getToken? resource = foo
  2. El servidor genera el token: token = foo || ahora () + 15 minutos
  3. Token de signos del servidor: h = HMAC (clave, token)
  4. El servidor devuelve el token firmado: token || h
  5. La aplicación abre el navegador en / resource? token = token
  6. El servidor valida que el hash en el token es válido para el recurso solicitado en el momento solicitado.
  7. El servidor proporciona contenido al navegador del usuario.
respondido por el David 09.06.2014 - 19:10
fuente

Lea otras preguntas en las etiquetas