sesion password onauthstatechanged expiration cerrar auth authentication facebook-authentication firebase firebase-security

authentication - password - ¿Cómo puedo iniciar sesión con múltiples servicios sociales con Firebase?



onauthstatechanged (4)

Acabo de crear un decorador de fuego angular para manejar esto para nosotros: angularfire-multi-auth

Quiero que los usuarios puedan autenticarse en mi aplicación de Firebase usando múltiples proveedores de autenticación diferentes, como Facebook, Twitter o Github. Una vez autenticado, quiero que los usuarios tengan acceso a la misma cuenta sin importar qué método de autenticación usaron.

En otras palabras, quiero fusionar múltiples métodos de autenticación en una sola cuenta dentro de mi aplicación. ¿Cómo puedo hacer esto en una aplicación de Firebase?


He pasado bastante tiempo pensando en una buena solución, y en mi humilde opinión poder registrarme de cualquier proveedor es confuso. Siempre busco un correo electrónico de registro, por lo que un usuario que inicie sesión con Facebook y Google +, por ejemplo, se registrará como el mismo usuario cuando le informe su correo electrónico.

De esta forma, los datos de muestra propuestos por Kuma no necesitan duplicar los UserMappings.

Almacén de datos de muestra:

userMappings |---facebook:777 | |---user:"123" |---twitter:888 |---user:"123" users |---123 |---user data


Sé que esta publicación existe desde hace meses, pero cuando me enfrenté a este problema, me llevó mucho tiempo hacer que el código fuera más flexible. Basado en el código Andrew anterior, modifiqué un poco el código.

Almacén de datos de muestra:

userMappings |---facebook:777 | |---user:"123" |---twitter:888 |---user:"123" users |---123 |---userMappings |---facebook: "facebook:777" |---twitter: "twitter:888"

Reglas de seguridad:

"userMappings": { "$login_id": { ".read": "$login_id === auth.uid", ".write": "auth!== null && (data.val() === null || $login_id === auth.uid)" } }, "users": { "$user_id": { ".read": "data.child(''userMappings/''+auth.provider).val()===auth.uid", ".write": "auth!= null && (data.val() === null || data.child(''userMappings/''+auth.provider).val()===auth.uid)" } }

Entonces UserMappings sigue siendo la primera información que buscamos al iniciar sesión en Facebook, Twitter ... el usuario de UserMappings apuntará a la cuenta principal de los usuarios . Entonces, después de iniciar sesión en Facebook o Twitter, podemos buscar la cuenta de usuario principal. En los usuarios guardamos una lista de UserMapping que puede acceder a sus datos.

Cuando creamos un nuevo usuario, primero debemos crear una cuenta en los usuarios . La identificación para el usuario en usuarios podría ser lo que queramos. Esto es flexible porque podemos proporcionar más métodos de inicio de sesión como Google, Github sin agregar más reglas de seguridad.


Actualización (20160521): Firebase acaba de lanzar una importante actualización de su producto Firebase Authentication , que ahora permite a un único usuario vincular cuentas de los diversos proveedores compatibles. Para obtener más información sobre esta característica, lea la documentación para iOS , Web y Android . La respuesta a continuación se deja por razones históricas.

El servicio principal de Firebase proporciona varios métodos para la autenticación: https://www.firebase.com/docs/security/authentication.html

En esencia, Firebase usa tokens JWT seguros para la autenticación. Todo lo que resulte en la producción de un token JWT (como el uso de una biblioteca JWT en su propio servidor) funcionará para autenticar a sus usuarios en Firebase, por lo que tendrá control total sobre el proceso de autenticación.

Firebase proporciona un servicio llamado Firebase Simple Login que es una forma de generar estos tokens (esto proporciona nuestra autenticación de Facebook, Twitter, etc.). Está pensado para escenarios de autenticación comunes, de modo que puede comenzar a trabajar rápidamente sin ningún servidor, pero no es la única forma de autenticarse, y no pretende ser una solución integral.

Aquí hay un enfoque para permitir el inicio de sesión con múltiples proveedores mediante Firebase Simple Login:

  1. Almacene un identificador de usuario canónico para cada usuario, y un mapeo para cada identificador específico del proveedor para ese único ID canónico.
  2. Actualice sus reglas de seguridad para que coincida con cualquiera de las credenciales en una cuenta de usuario determinada, en lugar de solo una.

En la práctica, las reglas de seguridad pueden verse así, suponiendo que desea habilitar la autenticación de Twitter y Facebook (o permitir que un usuario cree una cuenta con una y luego agregar la otra):

{ "users": { "$userid": { // Require the user to be logged in, and make sure their current credentials // match at least one of the credentials listed below, unless we''re creating // a new account from scratch. ".write": "auth != null && (data.val() === null || (auth.provider === ''facebook'' && auth.id === data.child(''facebook/id'').val() || (auth.provider === ''twitter'' && auth.id === data.child(''twitter/id'').val()))" } }, "user-mappings": { // Only allow users to read the user id mapping for their own account. "facebook": { "$fbuid": { ".read": "auth != null && auth.provider === ''facebook'' && auth.id === $fbuid", ".write": "auth != null && (data.val() == null || root.child(''users'').child(data.val()).child(''facebook-id'').val() == auth.id)" } }, "twitter": { "$twuid": { ".read": "auth != null && auth.provider === ''twitter'' && auth.id === $twuid", ".write": "auth != null && (data.val() == null || root.child(''users'').child(data.val()).child(''twitter-id'').val() == auth.id)" } } } }

En este ejemplo, almacena una ID de usuario global (que puede ser cualquier cosa de su elección) y mantiene un mapeo entre los mecanismos de autenticación de Facebook, Twitter, etc. en el registro de usuario primario. Al iniciar sesión para cada usuario, obtendrá el registro del usuario principal de las asignaciones de usuarios y usará ese ID como la tienda principal de datos y acciones del usuario. Lo anterior también restringe y valida los datos en las asignaciones de usuario para que solo pueda escribirlo el usuario adecuado que ya tenga el mismo ID de usuario de Facebook, Twitter, etc. en / users / $ userid / (facebook-id | twitter -id | etc-id).

Este método te permitirá comenzar a usarlo rápidamente. Sin embargo, si tiene un caso de uso complicado y desea un control completo sobre la experiencia de autenticación, puede ejecutar su propio código de autenticación en sus propios servidores . Hay muchas bibliotecas útiles de código abierto que puede usar para hacer esto, como everyauth y el pasaporte .

También puede autenticarse utilizando proveedores de autenticación de terceros. Por ejemplo, puede usar Singly , que tiene una gran variedad de integraciones Singly usar sin que necesite escribir ningún código del lado del servidor.