He pasado por esto con sled.com. Aquí hay múltiples problemas con respecto a la creación de cuentas y el soporte de múltiples cuentas de terceros para iniciar sesión. Algunos de ellos son:
- ¿Necesita admitir tanto una contraseña local como inicios de sesión de terceros?
Para sled.com, he decidido eliminar la contraseña local debido al pequeño valor que agrega y el costo adicional de asegurar un formulario de ingreso de contraseña. Hay muchos ataques conocidos por romper contraseñas y si va a introducir contraseñas debe asegurarse de que no sean fáciles de romper. También debe almacenarlos en un hash unidireccional o similar para evitar que se filtren.
- ¿Cuánta flexibilidad desea permitir para admitir múltiples cuentas de terceros?
Parece que ya eligió los tres proveedores de inicio de sesión: Facebook, Twitter y LinkedIn. Eso es genial porque significa que está utilizando OAuth y está trabajando con un conjunto bien definido de proveedores confiables. No soy fanático de OpenID. La pregunta restante es si necesita admitir varias cuentas de terceros del mismo proveedor (por ejemplo, una cuenta local con dos cuentas de Twitter vinculadas). Supongo que no, pero si lo hace, deberá acomodar eso en su modelo de datos.
Para Sled, admitimos el inicio de sesión con Facebook, Twitter y Yahoo! y dentro de cada cuenta de usuario, guarde una clave para cada una: {"_id": "djdjd99dj", "yahoo": "dj39djdj", twitter: "3723828732", "facebook": "12837287"}. Configuramos un montón de restricciones para garantizar que cada cuenta de terceros solo se pueda vincular a una sola cuenta local.
Si va a permitir varias cuentas del mismo proveedor externo, necesitará usar listas u otras estructuras para respaldar eso, y con eso, todas las otras restricciones para garantizar la unicidad.
- ¿Cómo vincular varias cuentas?
La primera vez que el usuario se registra en su servicio, primero va al proveedor externo y regresa con una identificación de tercero verificada. Luego crea una cuenta local para ellos y recopila cualquier otra información que desee. Recopilamos su dirección de correo electrónico y también les pedimos que elijan un nombre de usuario local (intentamos rellenar previamente el formulario con su nombre de usuario existente del otro proveedor). Tener alguna forma de identificador local (correo electrónico, nombre de usuario) es muy importante para la recuperación de la cuenta más adelante.
El servidor sabe que este es un inicio de sesión por primera vez si el navegador no tiene una cookie de sesión (válida o caducada) para una cuenta existente, y que no se encuentra la cuenta de terceros utilizada. Intentamos informar al usuario que no solo están iniciando sesión, sino que están creando una nueva cuenta para que si ya tienen una cuenta, esperemos que pausen e inicien sesión con su cuenta existente.
Usamos exactamente el mismo flujo para vincular cuentas adicionales, pero cuando el usuario regresa de un tercero, la presencia de una cookie de sesión válida se utiliza para diferenciar entre un intento de vincular una nueva cuenta a una acción de inicio de sesión. Solo permitimos una cuenta de terceros de cada tipo y, si ya hay una vinculada, bloquea la acción. No debería ser un problema porque la interfaz para vincular una nueva cuenta está desactivada si ya tiene una (por proveedor), pero por las dudas.
Si un usuario intentó vincular una nueva cuenta de terceros que ya está vinculada a una cuenta local, simplemente solicite que confirme que desea fusionar las dos cuentas (suponiendo que pueda manejar dicha fusión con su conjunto de datos, a menudo es más fácil decirlo). que hecho). También puede proporcionarles un botón especial para solicitar una fusión, pero en la práctica, todo lo que están haciendo es vincular otra cuenta.
Esta es una máquina de estado bastante simple. El usuario regresa del tercero con una identificación de cuenta de terceros. Su base de datos puede estar en uno de tres estados:
- La cuenta está vinculada a una cuenta local y no hay ninguna cookie de sesión presente -> Iniciar sesión
- La cuenta está vinculada a una cuenta local y hay una cookie de sesión presente -> Fusionar
- La cuenta no está vinculada a una cuenta local y no hay una cookie de sesión presente -> Registrarse
La cuenta no está vinculada a una cuenta local y hay una cookie de sesión -> Vinculación de cuenta adicional
- ¿Cómo realizar la recuperación de la cuenta con proveedores externos?
Esto sigue siendo territorio experimental. No he visto una experiencia de usuario perfecta para esto, ya que la mayoría de los servicios proporcionan una contraseña local junto a las cuentas de terceros y, por lo tanto, se centran en el caso de uso "Olvidé mi contraseña", no todo lo demás que puede salir mal.
Con Sled, hemos optado por utilizar "¿Necesita ayuda para iniciar sesión?" y cuando hace clic, solicite al usuario su correo electrónico o nombre de usuario. Lo buscamos y, si encontramos una cuenta coincidente, enviamos un correo electrónico a ese usuario con un enlace que puede iniciar sesión automáticamente en el servicio (válido por una vez). Una vez dentro, los llevamos directamente a la página de vinculación de cuentas, les decimos que deberían echar un vistazo y potencialmente vincular cuentas adicionales, y les mostramos las cuentas de terceros que ya han vinculado.