ruby on rails - providers - OmniAuth: Protección contra múltiples cuentas para el mismo usuario
rails devise omniauth (4)
Tengo un par de aplicaciones de Rails que busco integrar con OmniAuth, pero hay un problema conceptual que tengo con el que me gustaría resolverlo primero. Considere el siguiente escenario:
- Su aplicación, Foo, admite inicios de sesión de OmniAuth a través de Twitter y Facebook.
- Joe llega a su sitio e inicia sesión a través de su cuenta de Twitter. Esto crea un nuevo usuario en Foo y lo asocia con esta nueva autorización de Twitter.
- Joe cierra la sesión de Foo y se olvida del sitio durante seis meses.
- Joe regresa a Foo, sin recordar que previamente se ha conectado con Twitter.
- Joe inicia sesión con Facebook. Dado que aún no ha iniciado sesión a través de su autorización original de Twitter, no hay manera de detectar que él es, de hecho, el mismo Joe, y se crea una nueva cuenta.
- Joe descubre su antigua cuenta y ahora se siente frustrado porque su contenido anterior está vinculado a esta antigua cuenta y no puede iniciar sesión con Twitter y Facebook de manera intercambiable.
Dado que Twitter no le proporciona a Foo una dirección de correo electrónico, no hay un identificador universal para detectar que los dos Joes son el mismo Joe. Podría decidir apoyar solo a los proveedores que le proporcionen la dirección de correo electrónico del usuario, pero esto no ayuda si el usuario se ha registrado con diferentes direcciones de correo electrónico en diferentes proveedores.
La única otra solución que se me ocurre es ofrecerle al usuario alguna forma de fusionar dos cuentas existentes. Ese es un gran dolor de cabeza comparado con la relativa facilidad de todo lo demás cuando se usa OmniAuth. Si esta es la única solución, ¿alguien ha encontrado una guía / tutorial que muestre un ejemplo de cómo se podría hacer esto? Me sorprende que este problema no haya recibido más atención dada la popularidad de OmniAuth.
¡Gracias!
Noté que el Desbordamiento de pila parece tratar de solucionar este problema, hasta cierto punto, al almacenar la preferencia de autenticación del usuario en una cookie e iniciar sesión de forma automática cuando regresa a la página de inicio de sesión.
Si bien aún no proporciona una solución completa a este problema, probablemente ayude a minimizar las consecuencias.
Sé que esta es una pregunta antigua, pero pensé que respondería con lo que he hecho recientemente en un proyecto de todos modos, solo como referencia.
Revelación completa: no se me ocurrió esto, se lo robé a alguien más en la web. Hay un buen artículo en la wiki de Omniauth .
Nunca encontré una buena forma de vincular automáticamente las cuentas de Facebook / Twitter / etc, sino que lo hice para que el usuario pueda vincular varias cuentas una vez que haya iniciado sesión con la primera.
Este es el escenario:
- El usuario inicia sesión con, por ejemplo, Facebook
- Tienen una página de perfil que enumera las redes sociales que han adjuntado a la cuenta y una opción para vincular cada tipo a la cuenta.
- por ejemplo, "Facebook Linked | Link Twitter | Link Google"
- "Enlace a Twitter", por ejemplo, enlaces a la misma acción omniauth que un usuario usaría para iniciar sesión en Twitter
- en el controlador de devolución de llamada, verifique si el usuario ha iniciado sesión
- si lo son, almacene el proveedor y el uid en un registro separado para el usuario
- De lo contrario, inicie sesión como de costumbre.
En lugar de almacenar el proveedor y el uid en el modelo de usuario, el modelo sería un usuario que puede tener muchas identidades de redes sociales.
Nuevamente, lamento haber resucitado a los muertos, pero el comentario de Abe Petrillo en respuesta a la respuesta aceptada me hizo pensar que otra opinión podría ser útil.
También me encontré con este problema hoy. Creo que lo manejaré de la siguiente manera:
Le pediré al usuario su correo electrónico y una contraseña cuando se registre, al igual que en una configuración de autenticación tradicional, donde trato de obtener el correo electrónico del servicio OmniAuth que el usuario ha elegido (FB, Twitter, ...). Por lo tanto, solo tienen que proporcionar el correo electrónico si no lo proporciona el proveedor de autenticación. Luego, si el usuario inicia sesión más tarde con el mismo proveedor que usó para registrarse, iniciará sesión de inmediato. Esto probablemente sucederá en el 99% de todos los casos.
Sin embargo, al tener el correo electrónico y la contraseña del usuario también puedo manejar todo tipo de casos que pueden ocurrir (incluido el que usted describe):
El proveedor de autenticación original está inactivo o el usuario eliminó su cuenta de proveedor de autenticación -> Solución: el usuario puede iniciar sesión de manera tradicional, utilizando su correo electrónico y contraseña. (Tenga en cuenta que este es un caso importante que aún no he visto mencionado en ninguna parte de la red. La gente parece asumir que FB, Twitter, etc. estarán allí para siempre, nunca se apagarán y los usuarios nunca abandonarán sus cuentas con esos servicios. Al no almacenar el pw y el correo electrónico de los usuarios, perderá todas las cuentas de usuario que haya generado un proveedor si ocurre alguno de estos casos, ya que no puede asignarlos a los usuarios. Para mí, esto es una dependencia inaceptable de una servicio externo)
El usuario inicia sesión más tarde con un proveedor de autenticación diferente (este es su caso) -> Solución: intente asignar el usuario a una cuenta existente usando su correo electrónico, si eso falla, muestre el formulario de registro con un botón / enlace "Ya he una cuenta, por favor inicie sesión en "(o similar ;-). Si hacen clic en eso, tienen que proporcionar su correo electrónico y contraseña. Luego, si se autentican correctamente, puede simplemente agregar ese proveedor al registro de usuario existente, y la próxima vez que inicien sesión de inmediato, al igual que con el proveedor que usaron originalmente para registrarse ...
Tal vez hay otros casos que podrían ocurrir. ¿Cualquier retroalimentación?
Tu intuición es correcta. Tendrá que proporcionar una herramienta de combinación para su usuario ... o puede ignorar el problema.