¿Cómo debo manejar la autenticación para una aplicación de chat de iPhone simple?
Backend
Estoy creando el backend usando dos servidores de aplicaciones:
-
Servidor REST Sinatra
Enumera los usuarios & mensajes antiguos.
-
Node.js WebSocket Server
Envía & recibe nuevos mensajes.
Propuesta
-
Cuando un usuario se registra o inicia sesión, el servidor REST devuelve un token de acceso.
-
La aplicación de iPhone pasa el token de acceso al servidor WebSocket en la conexión .
-
El servidor WebSocket deriva la ID de usuario del token de acceso.
Pensamientos
Quiero hacer la menor cantidad de trabajo que haga que la aplicación sea razonablemente segura.
-
Autenticación de la aplicación para iPhone: almacene un
cleint_secret
compartido en la aplicación para iPhone usando Servicios de llavero . Pase elclient_secret
al servidor REST para el registro & solicitudes de inicio de sesión. Esto permite al servidor REST verificar que todas las solicitudes provengan de la aplicación del iPhone y, por lo tanto, evitar que los atacantes se registren o se registren desde otros clientes. Facebook autentica las aplicaciones de iOS usando solo app & ID de paquete. Eso sería genial porque entonces no necesitaría crear unclient_secret
, pero no estoy seguro de cómo lo hacen. -
Generación de token de acceso: sería genial si la ID de usuario estuviera encriptada de alguna manera en el token de acceso con un secreto compartido entre REST y amp; Servidores webSocket. Luego, el servidor WebSocket podría usar el secreto compartido para verificar el token de acceso y extraer su ID de usuario. ¿Es eso posible? Si es así, ¿qué es un algoritmo seguro para lograrlo? Creo que puedo hacer esto con HMAC , donde el mensaje es el ID de usuario. Si es así, ¿qué algoritmo HMAC debo usar? Estos son algunos de mis pensamientos recientes sobre cómo generar un token de acceso . Algo así como HMAC sería genial porque entonces no necesitaría almacenar tokens de acceso para cada ID de usuario, por ejemplo, en una base de datos de Redis. Aunque, tal vez eso es lo que debería hacer. Porque ahora que lo pienso, si uso algo como HMAC y me roban el token de acceso de un usuario, ¿cómo puedo restablecer ese token de acceso sin restablecer todos ellos?