17

使用 firebase admin SDK 创建用户后,如何发送验证电子邮件?我正在尝试结合createUser functionsendEmailVerification function 有人可以指出提示或答案吗?谢谢

更新:

用户创建由已在应用程序中登录的管理员用户完成,因此管理员用户只是在仪表板上创建用户。这与注册方法完全不同。

更新2:

我试图按照bojeil 的回答,我仍然坚持用户使用自定义令牌登录的步骤。它与我当前的管理员用户会话发生冲突,管理员用户被踢出,而是新用户登录,即使我退出新用户,管理员用户仍然退出,需要登录才能重新进入应用程序。

这是我获得自定义令牌后在应用程序中的代码:

$http.post('/.custom-token', {uid: $scope.data.data.uid})
        .then(function (response) {
            console.log("custom token here:", response.data.token);
            firebase.auth().signInWithCustomToken(response.data.token)
                .then(function (firebaseUser) {
                    firebaseUser.sendEmailVerification();
                    firebase.auth().signOut().then(function() {
                        // Sign-out successful.
                        console.log("signed out success");
                    }, function(error) {
                        // An error happened.
                    });
                })

                .catch(function(error) {
                    // Handle Errors here.
                    var errorCode = error.code;
                    var errorMessage = error.message;
                    // ...
                });

        });

因此,我获得了令牌,登录新用户,发送电子邮件验证链接,然后注销新用户。但是我正在执行所有这些操作的管理员用户也会被注销。我在这里想念什么?

4

6 回答 6

19

好的,这是您可以做的,但您可能会遇到配额限制:

  • 包括 firebase-admin 模块。
  • 包括 firebase 客户端模块。
  • 使用 admin sdk,通过 createUser 创建新用户
  • 当该承诺解决时,获取创建的用户的 uid。
  • 使用 admin sdk,为该 uid 创建自定义令牌。
  • 使用客户端 sdk,使用该自定义令牌的 signInWithCustom 令牌。
  • 过程中返回一个用户,调用 user.sendEmailVerification()
  • 从客户端 SDK 注销该用户。
于 2017-01-27T01:58:01.867 回答
4

您甚至不需要为此使用 Firebase Admin SDK。您可以只使用常规的 Firebase 客户端 SDK:

firebase.auth().createUserWithEmailAndPassword(email, password)
  .then(function(user) {
     console.log("User successfully created:", user.uid);
     return user.sendEmailVerification();
  })
  .then(function() {
    console.log("Email verification email successfully sent!");
  })
  .catch(function(error) {
    console.log("Error:", error);
  });
于 2017-01-26T23:14:57.860 回答
4

根据 firebase 的说法,admin-sdk 目前不支持此功能。在此处查看他们的回复: https ://stackoverflow.com/a/44557980/8177355

每当电子邮件/密码身份验证用户登录并尝试使用需要身份验证的功能时,我都会调用 onAuthStateChanged() 然后检查用户的电子邮件验证记录。

如果邮箱没有通过验证,而且我之前没有发送过验证邮件,我会自动发送。我返回一个错误,要求用户验证他们的电子邮件。(我在 Firestore 中为用户的配置文件设置中存储了一个变量,以指示它之前是否已发送)。

在以后尝试使用该应用程序时,如果电子邮件仍未验证,我会返回相同的错误,并且还会在标记为“重新发送验证电子邮件”的错误中包含一个按钮,该按钮会在按下时触发发送验证电子邮件。(这样我就不会在用户每次尝试做某事时自动发送大量验证电子邮件。)

于 2018-02-27T17:04:56.497 回答
4

一个相当干净的解决方案是实际使用 REST API。

curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/getOobConfirmationCode?key=[API_KEY]' \
-H 'Content-Type: application/json' \
--data-binary '{"requestType":"PASSWORD_RESET","email":"[user@example.com]"}'

[API KEY] 是一个 Web 客户端 api 密钥,可以从项目设置 > 添加应用程序 >> 单击 web 中检索,您将使用 JSON 获得配置,在 JSON 中有一个 APIKey 是您需要的使用。

于 2018-10-04T04:55:13.303 回答
1

我认为我们可以尝试以下组合:

于 2021-10-19T07:15:45.470 回答
0

这是bojeil在代码中的步骤,它在 NodeJS Firebase 云函数中工作。假设“admin”是您的 Firebase Admin SDK 实例,而“firebase”是您的 Firebase Client SDK 实例。

var userId = "YOURUSERIDHERE";
admin.auth()
        .createCustomToken(userId)
        .then((customToken) => {
            return firebase.auth().signInWithCustomToken(customToken)
        })
        .then((data) => {
            return data.user.sendEmailVerification({url: "http://YOURREDIRECTURL"});
        }).then((result) => {
            console.log("success");
        }).catch((error) => {
            console.log("faillure");
        });

通过创建服务帐户并在 Admin SDK 配置片段中对其进行初始化,确保您已正确设置 Admin SDK 。

于 2022-02-05T23:04:42.303 回答