Entendidos de Firebase, pregunta sobre autenticacion de usuarios

isvidal

Buenas noches,

Estoy metido en un proyecto de una aplicación móvil con un cliente que utiliza firebase para gestionar todo el tema de autenticación.

Una de las primeras tareas que me asigno fue el de vincular logins.

Por vincular logins el cliente entiende que si tu te conectaste por primera vez con Google, luego, si te desconectas te puedas conectar con Facebook y Firebase haga la vinculación de forma inteligente al compartir cuenta de correo.

Yo me documente y acabe llegando a la conclusión que firebase no te permite trabajar así, para vincular una forma de conexión nueva primero debes estar conectado con la original y con una sesión activa, y entonces si puedes vincular mas métodos de login para esa cuenta de firebase.

Y el me dice que no, que esto no es cierto, que tienes que ser capaz de hacer la vinculación desde fuera.

Yo de hecho le he pasado hasta la documentación de esto donde lo dice:

https://firebase.google.com/docs/auth/web/google-signin#handling-account-exists-with-different-credential-errors
https://firebase.google.com/docs/auth/web/facebook-login#handling-account-exists-with-different-credential-errors

Y donde yo ahí leo y entiendo justo lo que digo ahí arriba el me dice que no, que no dice eso que yo digo.

Entonces, a mi me parece que tiene todo el sentido del mundo a nivel de modelo, pero claro, explícaselo eso a un cliente con la idea justa de esto.

Y mi pregunta es, puedo ir all in a muerte que yo tengo razón, o no?

r2d2rigo

En efecto, hay otro articulo en la documentacion que te dice como implementar lo que quieres, y en el primer paso deja bien clarito que tienes que estar ya logeado.

To link auth provider credentials to an existing user account:

  • Sign in the user using any authentication provider or method.

https://firebase.google.com/docs/auth/android/account-linking

1 1 respuesta
JuAn4k4

Según leo yo, (en vertical) si se puede hacer.

Haces el proceso igual pero en vez de hacer Sign InWith debes buscar el id del user/provider que ya existe (seguramente por email) y usar el LinkWith

Lo pone bastante claro en los pasos yo diría

#2 Ahi no pone que ya esté autenticado, sino que se autentique primero con cualquier provider. En el siguiente paso te dice que hagas todo normal salvo SignWith que has de cambiar por el LinkWith si ya es un usuario que tiene login con otro proveedor y no con el que se ha autenticado.

1 respuesta
isvidal

#3 Pues yo no lo veo así para nada, para empezar porque para llamar al linkWithCredential primero debes pasar por el currentUser, y si no estas logueado no tienes current user como para poder llamar al linkWithCredential.

No hay ningún método, o yo no he sido capaz de encontrarlo que te permita buscar por X correo un usuario y meterle otra forma de login sin antes haberse logeado correctamente.

Es mas, es que si te paras a pensarlo tiene todo el sentido del mundo, imagínate que yo tengo activado el login por facebook con mi correo, si alguien luego se registra con mi correo y con una password me estas diciendo que vas a hacerle merge y va a poder acceder a mi cuenta?

Ofcourse que puedes meter una validación por correo, pero still.

2 respuestas
r2d2rigo

#4 yo estoy al 99% contigo, aparte que acabo de pensar que es un agujero de seguridad brutal, cualquiera con un poco de maña puede hacerse una cuenta nueva y falsificar el email asociado y conseguir que se asocie a una cuenta existente que no es suya.

Pero vamos si aun tienes dudas, date una vuelta por la web y mira a ver si hay alguna otra plataforma que haga lo que quiere el cliente (imgur? steam?), y asi si tienes razon (que estoy segurisimo) le das las pruebas al cliente para callarle la boca.

JuAn4k4

#4 Registrarte con email+password no tiene sentido, ya que el usuario ya existe, pero si puedes enviar un enlace al correo para establecer contraseña. Yo he hecho esto de linkar cuentas con diferentes logins, pero fuera de firebase, siempre y cuando te den el email, es lo único con lo que se pueden linkar desde fuera. Twitter por ejemplo no te da email, por lo que solo se puede linkar desde "dentro".

No soy experto en firebase, es más nunca lo he usado, pero la doc es confusa porque en el texto te dice una cosa, en el código te dice otra.

Es gracioso porque la documentación no te indica que tenga que estar ya logeado, pero todos parten de currentUser, así que solo se me ocurre una forma chabacana de hacerlo:

Puedes comprobar si el usuario ya existe cuando se registra con un proveedor

admin.auth().getUserByEmail(email)

Si ya existe, y no está vinculada la cuenta con el proveedor que está usando ahora mismo, abriría un flujo donde le dijera al usuario que ha de verificar que es su cuenta usando uno de los proveedores linkados a la cuenta primero y luego vincluar el nuevo.

B

Puede ser que lo quiera fuera de firebase, que se use solo para el auth pero luego el usuario en la aplicación va por otra parte, es bastante raro pero lo he visto alguna vez.

Hago con login con Google, el email es pepito@gmail.com, el login de firebase se hace normal, en el back miro si entre mis usuarios tengo alguno con ese email, lo encuentro o lo creo y devuelto su cuenta.

Hago login con Facebook, el email es tambien pepito@gmail.com, el login de firebase se hace normal y en el back devuelvo las cosas del usuario que tiene ese email.

Usuarios habituales