firebase admin SDK 创建用户并发送验证邮件
firebase admin SDK create user and send verification email
使用firebase admin SDK创建用户后如何发送验证邮件?
我正在尝试合并 createUser function
and sendEmailVerification function
有人可以指出提示或答案吗?谢谢
更新:
用户创建是由已在应用程序中登录的管理员用户完成的,因此管理员用户只是在仪表板上创建用户。这与注册方式完全不同。
更新 2:
我尝试遵循 ,我仍然坚持用户使用自定义令牌登录的步骤。它与我当前的管理员用户会话发生冲突,管理员用户被踢出,新用户登录,即使我注销新用户,管理员用户仍然退出,需要登录才能重新进入应用程序。
这是我获得自定义令牌后在应用程序中的代码:
$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;
// ...
});
});
所以,我得到令牌,登录新用户,发送电子邮件验证 link,然后,注销新用户。
但是执行所有这些操作的我的管理员用户也被注销了。
我在这里错过了什么?
您甚至不需要为此使用 Firebase Admin SDK。您可以只使用常规的 Firebase client-side 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);
});
好的,这是你可以做的,但你可能会遇到配额限制:
- 包括 firebase-admin 模块。
- 包括 firebase 客户端模块。
- 使用 admin sdk,通过 createUser 创建新用户
- 当该承诺解决时,获取创建的用户的 uid。
- 使用 admin sdk,为该 uid 创建自定义令牌。
- 使用客户端 sdk,signInWithCustom 令牌使用自定义令牌。
- 过程中返回一个用户,调用user.sendEmailVerification()
- 从客户端 SDK 注销该用户。
根据 firebase,admin-sdk 目前不支持此功能。在这里查看他们的回复:
每当电子邮件/密码验证用户登录并尝试使用需要验证的功能时,我调用 onAuthStateChanged() 然后检查用户的电子邮件验证记录。
如果邮箱未通过验证,而且我之前没有发送过验证邮件,我会自动发送。我 return 一个错误,要求用户验证他们的电子邮件。 (我在 firestore 的用户配置文件设置中存储了一个变量,以指示它之前是否已发送过)。
在以后尝试使用该应用程序时,如果电子邮件仍未验证,我会 return 出现相同的错误,并且还在标记为 "re-send verification email" 的错误中包含一个按钮,用于触发发送按下时验证电子邮件。 (这样我就不会在用户每次尝试做某事时自动发送大量验证电子邮件。)
一个相当干净的解决方案是实际使用 REST APIs。
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 密钥,可以从“项目设置”>“添加应用程序”>“单击网络”中检索,您将获得带有 JSON,在 JSON 中有一个 API 键,这是您需要使用的键。
我想我们可以尝试以下组合:
这是在 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");
});
通过 creating a service account 确保您已正确设置 Admin SDK,并在 Admin SDK 配置片段中对其进行初始化。
使用firebase admin SDK创建用户后如何发送验证邮件?
我正在尝试合并 createUser function
and sendEmailVerification function
有人可以指出提示或答案吗?谢谢
更新:
用户创建是由已在应用程序中登录的管理员用户完成的,因此管理员用户只是在仪表板上创建用户。这与注册方式完全不同。
更新 2:
我尝试遵循
这是我获得自定义令牌后在应用程序中的代码:
$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;
// ...
});
});
所以,我得到令牌,登录新用户,发送电子邮件验证 link,然后,注销新用户。 但是执行所有这些操作的我的管理员用户也被注销了。 我在这里错过了什么?
您甚至不需要为此使用 Firebase Admin SDK。您可以只使用常规的 Firebase client-side 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);
});
好的,这是你可以做的,但你可能会遇到配额限制:
- 包括 firebase-admin 模块。
- 包括 firebase 客户端模块。
- 使用 admin sdk,通过 createUser 创建新用户
- 当该承诺解决时,获取创建的用户的 uid。
- 使用 admin sdk,为该 uid 创建自定义令牌。
- 使用客户端 sdk,signInWithCustom 令牌使用自定义令牌。
- 过程中返回一个用户,调用user.sendEmailVerification()
- 从客户端 SDK 注销该用户。
根据 firebase,admin-sdk 目前不支持此功能。在这里查看他们的回复:
每当电子邮件/密码验证用户登录并尝试使用需要验证的功能时,我调用 onAuthStateChanged() 然后检查用户的电子邮件验证记录。
如果邮箱未通过验证,而且我之前没有发送过验证邮件,我会自动发送。我 return 一个错误,要求用户验证他们的电子邮件。 (我在 firestore 的用户配置文件设置中存储了一个变量,以指示它之前是否已发送过)。
在以后尝试使用该应用程序时,如果电子邮件仍未验证,我会 return 出现相同的错误,并且还在标记为 "re-send verification email" 的错误中包含一个按钮,用于触发发送按下时验证电子邮件。 (这样我就不会在用户每次尝试做某事时自动发送大量验证电子邮件。)
一个相当干净的解决方案是实际使用 REST APIs。
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 密钥,可以从“项目设置”>“添加应用程序”>“单击网络”中检索,您将获得带有 JSON,在 JSON 中有一个 API 键,这是您需要使用的键。
我想我们可以尝试以下组合:
这是在 NodeJS Firebase 云函数中运行的代码
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");
});
通过 creating a service account 确保您已正确设置 Admin SDK,并在 Admin SDK 配置片段中对其进行初始化。