【问题标题】:Sending email confirmation and adding data to collection after creating user in Firebase在 Firebase 中创建用户后发送电子邮件确认并将数据添加到集合
【发布时间】:2021-10-18 01:14:02
【问题描述】:

我为signup 创建了一个rest API。这个想法是使用

创建用户

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

需要做的另一件事是创建一个名为“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);

【问题讨论】:

    标签: node.js firebase-authentication google-cloud-functions firebase-admin


    【解决方案1】:

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

    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 功能。

    【讨论】:

    • 好吧,要点是只有客户端 sdk 有 sendVerificationEmail 选项,对吗?因此,如果我尝试通过后端发送确认电子邮件,我将不得不自定义。我的另一个问题是。既然我们定义了emailVerified: false,对吗?那么验证是真的还是我必须做点什么?
    • @FahimHoque 不是完全定制的。 generateEmailVerificationLink 会给你链接,但你必须自己手动发送电子邮件。休息程序应保持不变。
    • 您好,很抱歉回复晚了。我最终使用客户端 sdk 进行电子邮件确认。用户确认邮件后,有什么办法可以让emailVerified属性为真?
    • @FahimHoque Firebase 会在用户通过单击链接验证自己后为您执行此操作。虽然我不确定你是否需要强制刷新用户的 id 令牌
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2018-07-27
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2019-06-15
    • 2017-06-12
    相关资源
    最近更新 更多