Saltar al contenido

¿Cómo enviar la verificación por correo electrónico después de la creación del usuario con las funciones de Firebase Cloud?

Solución:

Hay dos posibilidades para enviar un correo electrónico de “verificación de correo electrónico” a un usuario:

  1. El usuario que inició sesión solicita que se le envíe un correo electrónico de verificación. Para eso, llama, desde el front-end, al sendEmailVerification() método desde el SDK de cliente adecuado.
  2. A través de uno de los SDK de administrador, genera un enlace para la verificación por correo electrónico a través del método correspondiente (p. Ej. auth.generateEmailVerificationLink() para el SDK de administrador de Node.js) y envía este enlace a través de un correo electrónico enviado a través de su propio mecanismo. Todo eso se hace en el back-end y se puede hacer en una función de nube.

Tenga en cuenta que la segunda opción con los SDK de administrador no es exactamente similar a la primera opción con los SDK de cliente: en la segunda opción debe enviar el correo electrónico a través de su propio mecanismo, mientras que en el primer caso, el correo electrónico es enviado automáticamente por el Plataforma Firebase

Si desea que esa capacidad se agregue al SDK de administrador, le recomiendo que presente una solicitud de función.

Así es como lo implementé con éxito usando las funciones de la nube de Firebase junto con un pequeño servidor backend express

La función de Firebase Cloud (en segundo plano) se activa con cada nuevo usuario creado

  • Esta función envía un objeto “usuario” a su punto final de API
const functions = require('firebase-functions');
const fetch = require('node-fetch');

// Send email verification through express server
exports.sendVerificationEmail = functions.auth.user().onCreate((user) => {
  // Example of API ENPOINT URL 'https://mybackendapi.com/api/verifyemail/'
  return fetch( < API ENDPOINT URL > , {
      method: 'POST',
      body: JSON.stringify({
        user: user
      }),
      headers: {
        "Content-Type": "application/json"
      }
    }).then(res => console.log(res))
    .catch(err => console.log(err));
});

Código del servidor intermedio

  • verifyEmail aquí se usa como middleware
// File name 'middleware.js'
import firebase from 'firebase';
import admin from 'firebase-admin';

// Get Service account file from firebase console
// Store it locally - make sure not to commit it to GIT
const serviceAccount = require('<PATH TO serviceAccount.json FILE>');
// Get if from Firebase console and either use environment variables or copy and paste them directly
// review security issues for the second approach
const config = {
  apiKey: process.env.APIKEY,
  authDomain: process.env.AUTHDOMAIN,
  projectId: process.env.PROJECT_ID,
};
// Initialize Firebase Admin
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

// Initialize firebase Client
firebase.initializeApp(config);

export const verifyEmail = async(req, res, next) => {
  const sentUser = req.body.user;
  try {
    const customToken = await admin.auth().createCustomToken(sentUser.uid);
    await firebase.auth().signInWithCustomToken(customToken);
    const mycurrentUser = firebase.auth().currentUser;
    await mycurrentUser.sendEmailVerification();
    res.locals.data = mycurrentUser;
    next();
  } catch (err) {
    next(err);
  }
};

Código del servidor

// Filename 'app.js'
import express from 'express';
import bodyParser from 'body-parser';
// If you don't use cors, the api will reject request if u call it from Cloud functions
import cors from 'cors';
import {
  verifyEmail
} from './middleware'

app.use(cors());
app.use(bodyParser.urlencoded({
  extended: true,
}));
app.use(bodyParser.json());

const app = express();
// If you use the above example for endpoint then here will be
// '/api/verifyemail/'
app.post('<PATH TO ENDPOINT>', verifyEmail, (req, res, next) => {
  res.json({
    status: 'success',
    data: res.locals.data
  });
  next()
})

Este punto final devolverá el objeto de usuario completo y enviará el correo electrónico de verificación al usuario.

Espero que esto ayude.

Primero vea la documentación de Firebase aquí.

Cuando la fase de registro se complete y tenga éxito, active la siguiente función de forma asincrónica:

 private void sendVerification() {
             FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
             user.sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                         system.print.out("Verification Email sent Champion")
                          }
                         }
                });
}

El usuario ahora recibirá un correo electrónico de verificación. Al hacer clic en el hipervínculo, el servidor del proyecto verificará al usuario con Firebase.

ingrese la descripción de la imagen aquí

¿Cómo se determina si un usuario verificó o no su correo electrónico?

 private void checkEmail() {

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    if (user.isEmailVerified()) {
           // email verified ...
    } else {
       // error : email not verified ...
    }
}

Lamentablemente, no puede personalizar el contenido / cuerpo de su correo electrónico de verificación (he mantenido una gran correspondencia con Firebase para proporcionar plantillas alternativas menos horribles). Puede cambiar el título o la identificación del remitente del mensaje, pero eso es todo.

No, a menos que vuelva a vincular su aplicación con su propia Web compatible. Aquí.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *