¿Hay alguna forma de hacer una confirmación por correo electrónico para la creación y / o restablecimiento de contraseña de Firebase?

La pregunta lo dice todo. En Firebase, ¿cómo confirmo el correo electrónico cuando un usuario crea una cuenta o, para el caso, restablezco la contraseña por correo electrónico?

Podría preguntar más ampliamente: ¿hay alguna forma de enviar correos electrónicos desde Firebase? Por ejemplo, notificaciones, etc. Este no es el tipo de cosas que normalmente haría en el lado del cliente.

Esto debería hacerse fuera de firebase. Guardo usuarios en / users / y mantengo un estado en ellos (PENDIENTE, ACTIVO, BORRADO). Tengo un pequeño servicio que monitorea a los usuarios de un estado PENDIENTE y envía un correo electrónico de confirmación. Que tiene un enlace a un servicio web que he creado para actualizar el estado del usuario a ACTIVE.

Actualizar

Tenga en cuenta que esta nunca fue una forma muy segura de manejar la verificación de correo electrónico, y dado que ahora Firebase admite la verificación de correo electrónico, probablemente debería usarse en su lugar.

Respuesta original

Resolví la verificación del correo electrónico usando la función de restablecimiento de contraseña.

En la creación de la cuenta, le doy al usuario una contraseña temporal (generada aleatoriamente). Luego desencadenaré un restablecimiento de contraseña que enviará un correo electrónico al usuario con un enlace. El enlace le permitirá al usuario establecer una nueva contraseña.

Para generar una contraseña aleatoria, puede usar un código similar a este:

function () { var possibleChars = ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?_-']; var password = ''; for(var i = 0; i < 16; i += 1) { password += possibleChars[Math.floor(Math.random() * possibleChars.length)]; } return password; } 

Tenga en cuenta que esto está sucediendo en el cliente, por lo que un usuario malintencionado podría alterar su lógica.

[Ingeniero en Firebase – Actualización 2014-01-27]

El inicio de sesión simple de Firebase ahora admite el restablecimiento de contraseñas para la autenticación de correo electrónico / contraseña.

A cada una de las bibliotecas cliente de Inicio de sesión simple se le ha dado un nuevo método para generar correos electrónicos de restablecimiento de contraseña para la dirección de correo electrónico especificada – sendPasswordResetEmail() en la Web y Android, y sendPasswordResetForEmail() en iOS.

Este correo electrónico contendrá un token temporal que el usuario puede usar para iniciar sesión en su cuenta y actualizar sus credenciales. Este token expirará después de 24 horas o cuando el usuario cambie su contraseña, lo que ocurra primero.

También tenga en cuenta que Firebase Simple Login permite la configuración completa de la plantilla de correo electrónico, así como la dirección de envío (incluido el correo electrónico de etiqueta blanca de su dominio para cuentas pagas).

Para obtener acceso a esta función, deberá actualizar su biblioteca de cliente a una versión de v1.2.0 o superior. Para obtener la última versión, consulte https://www.firebase.com/docs/downloads.html .

Además, consulte https://www.firebase.com/docs/security/simple-login-email-password.html para obtener los últimos Firebase Simple Login – Web Client docs.

A julio de 2016, es posible que no tenga que usar el enlace de reinicio, etc. Solo use las funciones sendEmailVerification() y applyActionCode :

En resumen, a continuación es básicamente cómo se acercará a esto, en AngularJS:

 // thecontroller.js $scope.sendVerifyEmail = function() { console.log('Email sent, whaaaaam!'); currentAuth.sendEmailVerification(); } // where currentAuth came from something like this: // routerconfig .... templateUrl: 'bla.html', resolve: { currentAuth:['Auth', function(Auth) { return Auth.$requireSignIn() // this throws an AUTH_REQUIRED broadcast }] } ... // intercept the broadcast like so if you want: .... $rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) { if (error === "AUTH_REQUIRED") { $state.go('login', { toWhere: toState }); } }); .... // So user receives the email. How do you process the `oobCode` that returns? // You may do something like this: // catch the url with its mode and oobCode .state('emailVerify', { url: '/verify-email?mode&oobCode', templateUrl: 'auth/verify-email.html', controller: 'emailVerifyController', resolve: { currentAuth:['Auth', function(Auth) { return Auth.$requireSignIn() }] } }) // Then digest like so where each term is what they sound like: .controller('emailVerifyController', ['$scope', '$stateParams', 'currentAuth', 'DatabaseRef', function($scope, $stateParams, currentAuth, DatabaseRef) { console.log(currentAuth); $scope.doVerify = function() { firebase.auth() .applyActionCode($stateParams.oobCode) .then(function(data) { // change emailVerified for logged in User console.log('Verification happened'); }) .catch(function(error) { $scope.error = error.message; console.log(error.message, error.reason) }) }; } ]) 

Y ooh, con el enfoque anterior, no creo que sea necesario mantener la verificación del correo electrónico de su usuario en el área de datos de su usuario. El applyActionCode cambia el emailVerified a true de false .

La verificación del correo electrónico es importante cuando los usuarios inician sesión con la cuenta local. Sin embargo, para muchas autenticaciones sociales, el emailVerified entrante emailVerified ya será true .

Explicado más en el artículo Verificación de correo electrónico con Firebase 3.0 SDK

Lo que hice para solucionar este problema fue usar Zapier, que tiene una API incorporada para firebase. Comprueba una ubicación para agregar elementos secundarios. Luego toma la dirección de correo y una url de verificación de los datos de los nuevos nodos y los envía hacia adelante. La url apunta a mi aplicación angular, que establece el correo electrónico del usuario como verificado.

Como alojo mis archivos de aplicación en Firebase, no necesito tener que ocuparme de servidores o procesos que realicen sondeos en segundo plano.

Hay una demora, pero como no locking a los usuarios antes de verificar los correos electrónicos, está bien. Zapier tiene un nivel gratuito y, como no tengo mucho tráfico, es una solución decente por el momento.

El nuevo Firebase SDK v3 parece ser compatible con la verificación de la dirección de correo electrónico, consulte aquí (ponga su propia identificación de proyecto en el enlace) pero parece que todavía no está documentada.

He hecho la pregunta sobre SO aquí

Ver la respuesta de @ SamQuayle allí con este enlace a los documentos oficiales .

Utilicé el siguiente código para verificar la verificación del correo electrónico después de crear una nueva cuenta.

 let firAuth = FIRAuth.auth() firAuth?.addAuthStateDidChangeListener { auth, user in if let loggedUser = user { if loggedUser.emailVerified == false { loggedUser.sendEmailVerificationWithCompletion({ (error) in print("error:\(error)") }) } else { print(loggedUser.email) } } else { // No user is signed in. print("No user is signed in.") } } 

Como lo señalaron varios otros Firebase ahora admite correos electrónicos relacionados con la cuenta, pero aún mejor, desde hace 10 días o así también es compatible con el envío de cualquier tipo de correo electrónico a través de Firebase Functions. Muchos detalles en los documentos y código de ejemplo aquí .

Usé MandrillApp. Puede crear una clave API que solo permita el envío de una plantilla. De esta manera, incluso si tu llave está expuesta, no se puede abusar de ella a menos que alguien quiera despedir toneladas de correos electrónicos de bienvenida para ti.

Ese fue un truco para levantarme del suelo. Ahora estoy habilitando CORS desde un EC2 que usa el token para verificar que el usuario exista antes de extenderles una bienvenida a través de SES.