在 Firebase 中创建用户后发送电子邮件确认并将数据添加到集合

Sending email confirmation and adding data to collection after creating user in Firebase

我为 signup 创建了休止符 API。这个想法是使用

创建用户

admin.auth().createUser({...}) 方法并在收到回复后发送电子邮件确认 link 到用户提供的电子邮件。

另一件需要做的事情是创建一个名为 'users' 的集合,并将一些用户数据添加到文档中,该文档的 ID 等于 auth id。

问题是我的应用程序可以很好地创建用户,但我没有收到任何电子邮件确认,也没有将数据添加到集合中。

代码:

const functions = require("firebase-functions");
const admin =  require("firebase-admin");
const express = require("express");
const app = express();
const cors = require("cors")({origin: true});

admin.initializeApp();
const db = admin.firestore();


app.get("/hello-world", (req, res) => {
    res.send("Hello World!");
});


// create user with email and password with admin sdk
app.post("/signup", cors, (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    
    // check if email is a valid email
    if (!email || !email.match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i)) {
        res.status(400).send("Invalid email");
        return;
    }
    
    admin.auth().createUser({
        email: email,
        password: password,
        emailVerified: false,
    }).then(function(userRecord) {
        admin.auth().sendEmailVerification(userRecord.uid).then(function() {
            res.send("User created");
        })
        return db.collection("users").doc(userRecord.uid).set({
            email: userRecord.email,
            password: userRecord.password,
            emailVerified: userRecord.emailVerified,
            username: "",
            firstName: "",
            lastName: "",
        });
    }).then(null, function(error) {
        res.status(400).send(error);
    })
});


exports.app = functions.https.onRequest(app);

Admin SDK 没有 sendEmailVerification 方法。虽然它有 generateEmailVerificationLink() 可用于生成验证 link,但您必须自己发送电子邮件。您可以尝试使用 Nodemailer or Firestore Trigger Email 扩展名。此外,return 语句会在电子邮件功能之前 运行,因此请尝试正确处理承诺。您可以尝试使用异步函数,如下所示:

app.post("/signup", cors, async (req, res) => {
  const email = req.body.email;
  const password = req.body.password;

  // check if email is a valid email
  if (!email || !email.match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i)) {
    res.status(400).send("Invalid email");
    return;
  }

  const userRecord = await admin.auth().createUser({
    email: email,
    password: password,
    emailVerified: false,
  })
  // Custom function to generate link and send email
  // await sendVerificationEmail()
  await db.collection("users").doc(userRecord.uid).set({
    email: userRecord.email,
    password: userRecord.password,
    emailVerified: userRecord.emailVerified,
    username: "",
    firstName: "",
    lastName: "",
  });
  return res.sendStatus(200)
});

其他选项是在 /signup 完成后在客户端登录用户,并使用客户端 SDK 使用 sendVerificationEmail 功能。