javascript - 火存储 : How to stop user account being created if a rule has failed?

标签 javascript firebase firebase-authentication google-cloud-firestore

我有一个简单的注册表单,用户可以在其中设置其详细信息,包括需要唯一的用户名。

我编写了一条规则来验证用户名是否已存在(有效),但即使注册失败,用户帐户也已创建。

注册脚本示例(精简):

try {
    // This creates a user on submit of the form.
    const data = await fb.auth.createUserWithEmailAndPassword(this.email, this.password)

    // Use the uid we get back to create a user document in the users collection.
    await db.collection('users').doc(data.user.uid).set({
      username: this.username, // This fails in the rule if it exists.
      firstName: this.firstName,
      lastName: this.lastName
    })
} catch (error) {
    console.log(error)
}

创建用户文档的调用失败,因为用户名不是唯一的(这是预期的),但此时在流程中,用户已在 Firebase 中创建!

如果他们随后选择其他用户名,则无法继续,因为 Firestore 已发现具有相同电子邮件地址的用户。

是否有更好的方法来创建此流程?

理想情况下,如果用户文档的创建因某种原因失败,我根本不想创建用户。

谢谢!

可能的解决方案:

我想如果 try/catch block 失败,我可以在创建用户后立即删除用户:

await data.user.delete() // ...but this seems hacky?

最佳答案

我建议在这里使用云功能,可能使用 http onCall一个会让它变得美好而简单。我还没有测试过下面的内容,但应该可以帮助您实现目标。

客户端代码

const createUser = firebase.functions().httpsCallable('createUser');
createUser({
    email: this.email,
    password: this.password,
    username: this.username,
    firstName: this.firstName,
    lastName: this.lastName
}).then(function(result) {
  console.log(result); // Result from the function
  if (result.data.result === 'success') {
     await firebase.auth().signInWithEmailAndPassword(this.email, this.password);
  } else {
      console.log('Username already exists')
  }
});

云功能

exports.createUser = functions.https.onCall(async (data, context) => {
    const email = data.email; 
    const password = data.password;
    const username = data.username;
    const firstName = data.firstName;
    const lastName = data.lastName;

    const usersQuery = await admin.firestore().collection('users').where('username', '==', username).get();

    if (usersQuery.size > 0) {
        return {
            result: 'username-exists'
        }
    } else {
        const user = await admin.auth().createUser({
            displayName: username,
            email: email,
            password: password
        });
        await admin.firestore().collection('users').doc(user.uid).set({
            username: username,
            firstName: firstName,
            lastName: lastName
        });
        return {
            result: 'success'
        }
    }
});

关于javascript - 火存储 : How to stop user account being created if a rule has failed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53445405/

相关文章:

firebase 身份验证/无效的自定义 token

javascript - PHP 服务器无法使用 ajax 接收 javascript 对象

javascript - 如何重构数组上的 .filter 方法以便传递过滤所需的另一个变量?

android - 如何从 Crashlytics 迁移到 Firebase Crashlyics(Firebase 项目不在列表中)

ios - Firebase 电子邮件验证总是返回错误的用户未验证。 iOS

ios - 如何让 firebase GIDSignin 始终询问用户电子邮件和密码?

ios - Firebase Auth Google - 始终询问帐户

javascript - 如何使可调整大小的框从左到下以及从右到上

javascript - 多个 div 淡入/淡出滚动效果不起作用

java - Firebase 实时数据库值检索