当前位置: 首页 > 知识库问答 >
问题:

适用于Firebase的Cloud Functions-已验证的电子邮件操作

江礼骞
2023-03-14

我正在尝试创建一个云函数触发器,该触发器将在电子邮件经过验证后执行。

在云函数示例中,我只能找到< code>onCreate和< code>onDelete的触发器示例。

在留档中,我发现了一些关于创建自定义操作处理程序的内容,但我实际上不想替换默认情况下的标准电子邮件验证对话框,我只想在电子邮件验证后更改“用户”的属性。

有人有过这样的经历吗?这有可能吗?还是我创建自定义验证视图/对话框网页的唯一选项?

共有3个答案

胡星汉
2023-03-14

创建发布按钮,以便用户触发云功能

我没有在auth.emailVerified后立即触发云功能,而是给我的用户一个“发布配置文件”按钮,该按钮会触发http云功能(传入user.uid)。此函数使用传入的 user.uid 查找用户身份验证

如果user.uid

给每个user.post写auth.emailVerified

默认情况下,发布文档“post.emailVerified”字段以 false 开头,除非通过云函数中的 adminFirestore 才能写入。

贺光华
2023-03-14

您仍然可以使用接口< code>UserInfo方法< code>isEmailVerified()在Android上检查验证状态(至少);为了在成功登录后发送另一封验证电子邮件,以防当前用户尚未验证电子邮件地址-并再次显示登录屏幕。人们也可以通过客户端库直接使用HTTP触发云功能或更新Firebase中的值。这可能也适用于其他平台客户端,在那里可以检查验证状态。

这并不完全是电子邮件刚被验证时的事件,但在每次登录尝试时,您都知道验证状态,并且该值可能仅与客户端相关。

袁华清
2023-03-14

我遇到了这个问题,花了很长时间才想出如何解决,所以我希望这也能帮助那些陷入其中的人:

1 -

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);
                            });
                    });

> < Li > < p > generateEmailVErificationLink()将根据我们在步骤3中保存的链接生成链接。

函数sendCustomVerificationEmail()只是一个内部函数,它克服了标准的电子邮件firebase发送

2 -

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();
                            });
                    });
  • 当我将链接保存在onCreate()中时,我现在可以查询该链接以获得我正在验证的用户

3 -

导航到身份验证

> < li>

单击编辑图标

航行

将生成的链接粘贴到步骤2中并保存:

保存链接

现在,自动生成的每个链接都将通过您在步骤2中创建的函数,您将能够处理您希望发生的操作。

我希望我能说清楚。

 类似资料:
  • 我已使用 firebase-ui 成功设置 Firebase 电子邮件/密码身份验证。 但出于安全原因,我希望用户确认她/他的电子邮件。但从上面的代码来看,它并没有向用户发送验证邮件。所以,我使用以下方法向用户发送验证邮件,如果他/她没有验证他的/她的帐户邮件。 但当我使用这个代码时,它会为同一个帐户发送多封验证邮件。这意味着每次用户重新加载页面时都会运行此方法。如果有人能帮助我识别是否使用fir

  • 如何使用firebase中的验证电子邮件验证使用电子邮件和密码登录的用户?这背后的逻辑是如何工作的,它在代码中会是什么样子? 解决方案/帮助:对于那些仍在寻找答案的人,我找到了这篇文章 堆栈溢出 帖子

  • 我有一个关于firebase电子邮件验证工作的问题。 案例: 我的用户已登录我的网站(使用设备A)。 他们使用其他浏览器或设备(设备B)创建另一个帐户,但他们使用他已登录的浏览器和设备(设备A)打开电子邮件验证链接。 已经登录的用户(在设备A中)发生了什么?firebase是将它们签出还是只是验证新的电子邮件,但仍然与当前用户签入?

  • 我是Firebase的新手。我需要一种在注册过程中验证电子邮件地址的方法。未经验证,用户不应该自动登录。我可以添加什么代码来检查电子邮件是否经过验证。如果是,用户可以登录。如果不是,他们需要首先登录。请参阅下面的代码

  • 我的电子邮件验证有问题。我的错误是“用户为空”,因此它不会发送验证电子邮件,但会在控制台和My console.firebase.google中显示登录uid。com项目显示已注册的电子邮件。我应该更改什么,以便发送电子邮件,并且在用户验证其电子邮件之前不允许访问?我读过文件,但想不出来。提前谢谢你。

  • 每当我在Firebase中使用电子邮件/密码身份验证提供程序时,提供程序都会在成功注册时发送一个无记名令牌,即使是。是否有一种开箱即用的方法将电子邮件/密码身份验证提供程序配置为在用户验证其电子邮件地址之前不发送无记名令牌(并返回403错误)? 请注意,我知道如何创建用户、登录用户、发送验证电子邮件等。。。使用firebase v9。x通过firebase/auth中的方法创建用户(使用Email