firebase admin SDK 创建用户并发送验证电子邮件

Posted

技术标签:

【中文标题】firebase admin SDK 创建用户并发送验证电子邮件【英文标题】:firebase admin SDK create user and send verification email 【发布时间】:2017-06-12 11:10:00 【问题描述】:

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

更新:

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

更新 2:

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

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

$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;
                    // ...
                );

        );

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

【问题讨论】:

嗨!我正在研究类似的东西。您是如何克服管理员注销问题的? 你应该在 sendEmailVerification() 的 then 函数中调用 signOut 函数。由于 sendEmailVerification 是异步的,所以你应该等到执行完成后再调用 signOut 函数。 【参考方案1】:

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

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

【讨论】:

hmmm,但是使用用户令牌登录,会不会与我当前的管理员用户登录会话冲突? 用户登录不会与您的管理会话冲突。在这种情况下,您不能依赖 currentUser 并在登录时对返回的用户实例运行 sendEmailVerification。 感谢您的提示,我尝试按照您的解释进行操作,但仍有问题,请参阅我更新的问题。谢谢。 我不明白您所说的管理员用户是什么意思?这是您可以做的一件事,您可以创建运行这些临时登录操作的 firebaseApp 的副本: var tempApp = firebase.initializeApp(clientConfig, 'temp');然后您使用 tempApp.auth().signInWithCustomToken... 这不会与您的其他实例冲突。 我在这个问题上花了几天时间,找到了这个答案。感谢您的回答。你让我开心:)【参考方案2】:

您甚至不需要为此使用 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);
  );

【讨论】:

我认为你没有抓住重点:If the new account was created, the user is signed in automatically. Have a look at the Next steps section below to get the signed in user details. 它是自动登录的。正在创建另一个 userX 的用户已经登录,如果这个新的 userX 也登录了,将会有一个会话令牌中的冲突。 很遗憾,我不明白您要问什么。 这对我有用。我不得不稍微调整第一个回调 (user)=>user.user.sendEmailVerification()【参考方案3】:

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

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

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

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

【讨论】:

【参考方案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 密钥,可以从 Project Settings > add an app >> click web 中获取,您将使用 JSON 获得配置,在 JSON 中有一个 APIKey您需要使用的。

【讨论】:

【参考方案5】:

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

createUser() generateEmailVerificationLink Send the email verification link using Firebase Trigger Email Extension。

【讨论】:

以上是关于firebase admin SDK 创建用户并发送验证电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 firebase admin sdk 列出所有用户

如何从 Admin SDK 创建 Firebase 动态链接

我可以使用 Firebase Admin SDK for Node 重置用户密码吗?

Firebase云功能Admin SDK - 列出用户 - 分页问题

“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌

如何在我的 Angular 应用程序中使用 Firebase Admin SDK?