在 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
功能。
我为 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
功能。