我正在尝试创建一个云功能触发器,该触发器将在验证电子邮件后执行。
在Cloud Functions samples中,我只能找到有关onCreate
和onDelete
触发器的示例。
在the documentation内,我发现了一些关于创建自定义操作处理程序的内容,但我实际上并不想替换默认情况下的标准电子邮件验证对话框,我只是想更改“用户”之后的属性。电子邮件已经过验证。
有没有人有这方面的经验,这甚至可能吗?或者,我是创建自定义验证视图/对话框网页的唯一选择吗?
答案 0 :(得分:1)
您仍然可以使用界面UserInfo
方法isEmailVerified()
在Android上至少检查验证状态;例如。为了在成功登录后发送另一封验证电子邮件,以防当前用户尚未验证电子邮件地址-并再次显示登录屏幕。也可以通过客户端库通过HTTP触发云功能或直接在Firebase中更新值。这也可能适用于其他平台客户端,在该平台上可以检查验证状态。
这不是刚刚经过验证的电子邮件时的事件,但是在每次登录尝试时,都会知道验证状态,并且该值可能仅在客户端相关。
答案 1 :(得分:0)
我遇到了这个问题,花了我很长时间才弄清楚如何解决,所以我希望这也可以帮助任何陷入其中的人:
1->我创建了一个由onCreate()触发的新用户函数
exports.sendConfirmationEmail = functions.auth.user()
.onCreate((user) => {
const actionCodeSettings = {
url: 'https://appNextURL.com/',
handleCodeInApp: false//ensure that the link will open into browser
};
return admin.auth().generateEmailVerificationLink(user.email, actionCodeSettings)
.then(async (link) => {
await db.collection('users').doc(user.uid).set({
verificationLink: link,
emailVerified: false
}, {merge: true});
return sendCustomVerificationEmail(user.email, user.displayName, link);
})
.catch((err) => {
console.error("Error:", err);
return Promise.reject(err);
});
});
generateEmailVErificationLink()将基于我们将在步骤3中保存的链接生成链接。
sendCustomVerificationEmail()函数只是一个内部函数,它克服了标准的电子邮件firebase send
2->然后,我创建了一个函数,该函数将接收手动http触发器,其中包含将在发送自动电子邮件时由firebase自动生成的数据
exports.verifyEmail = functions.https.onRequest((req, res) => {
const {mode, oobCode, apiKey, continueUrl, lang} = req.query;
const link = "https://us-central1-projectId.cloudfunctions.net/verifyEmail/?mode=" + encodeURIComponent(mode) + "&oobCode=" + encodeURIComponent(oobCode) + "&apiKey=" + encodeURIComponent(apiKey) + "&continueUrl=" + encodeURIComponent(continueUrl) + "&lang=" + encodeURIComponent(lang);
return db.collection("users")
.where("verificationLink", "==", link)
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(function (user) {
const userData: UserData = user.data();
console.log("email verified: ", userData.userId);
return admin.auth().updateUser(userData.userId, {
emailVerified: true
}).then(function (userRecord) {
return db.collection('users').doc(userData.userId).set({emailVerified: true}, {merge: true});
});
});
return res.sendStatus(200).end();
}).catch(function (err) {
console.log("error:", err);
return res.sendStatus(403).end();
});
});
3->第三步是将Firebase身份验证模板中的链接更改为在第二步中生成的链接:
导航到身份验证>模板:
单击编辑图标>单击自定义操作URL:
将在第2步中生成的链接粘贴并保存:
现在,每个自动生成的链接都将使用您在第2步中创建的功能,并且您将能够处理想要执行的操作。
我希望我会清楚
答案 2 :(得分:-1)
创建一个发布按钮,以便您的用户触发您的云功能
我不是在auth.emailVerified时立即触发云功能,而是给用户一个“发布配置文件”按钮,它会触发http云功能(传入user.uid)。此功能使用传入的user.uid
查找用户身份验证。如果user.uid && auth.emailVerified
写auth.email已验证给每个用户。post
默认情况下,发布文档的“ post.emailVerified”字段以false开头,除非通过云功能中的adminFirestore才能写入。