2011-01-10 9 views
27

Tengo un par de aplicaciones de Rails que quiero integrar con OmniAuth, pero hay un problema conceptual que tengo con él que me gustaría descubrir primero . Tenga en cuenta la situación siguiente:OmniAuth: Protección contra múltiples cuentas para el mismo usuario

  1. Su aplicación, Foo, admite los inicios de sesión de OmniAuth a través de Twitter y Facebook.
  2. 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.
  3. Joe cierra la sesión de Foo y se olvida del sitio durante seis meses.
  4. Joe regresa a Foo, sin recordar que ha iniciado sesión previamente con Twitter.
  5. Joe se conecta con Facebook. Como todavía no ha iniciado sesión con su autorización original de Twitter, no hay forma de detectar que él es, de hecho, el mismo Joe, y se crea una cuenta nueva.
  6. Joe descubre su cuenta anterior, y ahora está frustrado de que su contenido anterior esté vinculado a esta cuenta anterior, y que no puede iniciar sesión de manera intercambiable con Twitter y Facebook.

Dado que Twitter no proporciona a Foo una dirección de correo electrónico, no existe un identificador universal para detectar que los dos Joes son el mismo Joe. Puede 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 puedo pensar es darle al usuario una forma de fusionar dos cuentas existentes. Eso es un gran dolor de cabeza en comparación 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 tema no haya recibido más atención dada la popularidad de OmniAuth.

Gracias!

+1

No veo una solución perfecta para este problema. Por lo tanto, he decidido ir con proveedor único por ahora hasta que encuentre una solución sólida para esto. – hnprashanth

+1

Hola Jimmy Cuadra, puedes mirar try.discourse.org. Discurso ha implementado múltiples opciones de registro utilizando omniauth. Su código fuente está disponible en GitHub. –

Respuesta

7

Tu instinto es correcto. Tendrá que proporcionar una herramienta de combinación para su usuario ... o puede ignorar el problema.

+4

¿Cómo es esta la respuesta aceptada? ¿Alguien descubre una herramienta de fusión decente todavía? –

+2

¿Porque es la única respuesta posible? No puede evitar que un usuario obtenga dos cuentas por accidentes. No hay una herramienta de fusión que pueda saber qué hacer en su aplicación. La única buena práctica de usar para ayudar a la facilidad * * el proceso de fusión es separar las identidades de autenticación de los perfiles reales de los usuarios en su aplicación. De esta forma, su aplicación puede permitir que varios proveedores de autenticación se vinculen a un único perfil de usuario. – mlibby

2

Me di cuenta de que Stack Overflow parece tratar de superar este problema, hasta cierto punto, al almacenar la preferencia de autenticación del usuario en una cookie y automáticamente iniciar sesión cuando regrese a la página de inicio de sesión.

Aunque todavía no proporciona una solución completa a este problema, probablemente ayude a minimizar las consecuencias.

+0

Pero si el usuario borra sus cookies ... – SZH

+0

o si el usuario cambia de computadora –

+1

u otro usuario usa la misma computadora y navegador –

3

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 al iniciar sesión, al igual que en una configuración de autenticación tradicional, donde trato de obtener el correo electrónico del servicio OmniAuth. ha elegido (FB, Twitter, ...). Por lo tanto, solo deben enviar el correo electrónico si el proveedor de autenticación no lo proporciona. Luego, si el usuario inicia sesión más tarde con el mismo proveedor que utilizó para registrarse, se registrará de inmediato. Esto probablemente sucederá en el 99% de todos los casos.

Sin embargo, tener el correo electrónico y la contraseña del usuario también puede manejar todo tipo de casos que podrían ocurrir (incluyendo el que usted describe):

  • El proveedor de autenticación original es hacia abajo o el usuario eliminado su cuenta de proveedor de autenticación -> Solución: el usuario puede iniciar sesión de la manera tradicional, utilizando su correo electrónico y contraseña. (Tenga en cuenta que este es un caso importante que aún no he mencionado en la red. La gente parece suponer que FB, Twitter, etc. estarán allí para siempre, nunca estarán caídos y los usuarios nunca abandonarán sus cuentas con esos servicios. Al no almacenar los usuarios pw y correo electrónico perderá todas sus cuentas de usuario que fueron generadas por un proveedor si ocurre uno de estos casos, ya que no puede mapearlos a los usuarios. Para mí eso es una dependencia inaceptable de un 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 al usuario a una cuenta existente usando su correo electrónico, si eso falla, muestre el formulario de suscripción con un botón/enlace "Ya tengo una cuenta, por favor conéctame" (o similar ;-). Si hacen clic en eso, deben proporcionar su correo electrónico y contraseña. Entonces, si se autentica correctamente, puede simplemente añadir que el proveedor al registro de usuario existente, y la próxima vez que se registran de inmediato, al igual que con el proveedor que utilizaron originalmente para el registro ...

Tal vez hay otros casos que podrían ocurrir. ¿Cualquier retroalimentación?

+2

Creo que una mejor manera es confiar exclusivamente en el correo electrónico y mapear autenticaciones externas adicionales por correo electrónico a los usuarios internos. Luego, envíele al usuario un correo con un enlace para validar su identidad. Esto es más conveniente que usar una 'contraseña de respaldo'. – Nico

6

Sé que esta es una vieja pregunta pero pensé que respondería con lo que he hecho recientemente en un proyecto de todos modos, solo como referencia.

Descripción completa: No se me ocurrió esto, se lo robé a alguien más en la web. Hay una buena redacción on the Omniauth wiki.

Nunca encontré una buena manera de vincular automágicamente 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
  • Ellos tienen una página de perfil que enumera las redes sociales que se han adherido a la cuenta, y una opción para vincular cada tipo a la cuenta
    • por ejemplo, "Facebook Linked | Enlace Twitter | Enlace Google"
  • "Enlace Twitter" por ejemplo, vínculos a la misma acción OmniAuth un usuario podría utilizar para iniciar sesión en Twitter
  • en el manejador de devolución de llamada, comprobar para ver si el usuario se registra en
    • si lo son, almacenar el proveedor y uid en un registro separado para el usuario
    • lo contrario, ellos iniciar la sesión como de costumbre

En lugar de almacenar el proveedor y el fluido en el modelo de usuario, el modelo sería entonces un usuario puede tener muchas identidades de red social.

Nuevamente, perdón por haber levantado 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.

+0

Esto fue muy útil. Estaba tratando de hacer exactamente esto. Muchas gracias :) –

Cuestiones relacionadas