Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在angular中从firebase中删除经过身份验证的用户_Javascript_Angular_Firebase_Firebase Authentication - Fatal编程技术网

Javascript 如何在angular中从firebase中删除经过身份验证的用户

Javascript 如何在angular中从firebase中删除经过身份验证的用户,javascript,angular,firebase,firebase-authentication,Javascript,Angular,Firebase,Firebase Authentication,单击按钮时,我调用了一个函数 onDelete(id:string){ this.db.collection('Students').doc(id).delete(); } 这里,id是我要删除的文档的名称,db是AngularFireStore类型的属性,“Students”是集合的名称 文件结构: 在上图中,集合名称是Students,在该名称下存在多个文档,因为文档名称必须是唯一的,所以我给该名称指定了一个类型字符串作为id。在每个文档中都有电子邮件字段,我想在删除同一文档时从身份验证中

单击按钮时,我调用了一个函数

onDelete(id:string){ this.db.collection('Students').doc(id).delete(); }
这里,id是我要删除的文档的名称,db是AngularFireStore类型的属性,“Students”是集合的名称

文件结构: 在上图中,集合名称是Students,在该名称下存在多个文档,因为文档名称必须是唯一的,所以我给该名称指定了一个类型字符串作为id。在每个文档中都有电子邮件字段,我想在删除同一文档时从身份验证中删除该电子邮件

注册用户的代码:

this.afAuth.auth.createUserWithEmailAndPassword(email:string,password:string).then(res=>{})

如果要删除Firebase身份验证中存在的用户,有两种可能:

1/使用JavaScript SDK(因为您的应用程序是用angular制作的) 您可以调用该方法,如下所示:

const user = firebase.auth().currentUser;
user.delete()
.then(() => {
   //....
})
.catch(err => {
  if (err.code === "auth/requires-recent-login") {
     //Re-authenticate the user 
  } else {
     //....
  }
})
exports.deleteUser = functions.firestore
    .document('Students/{studentID}')
    .onDelete((snap, context) => {

        const deletedValue = snap.data();
        const userEmail = deletedValue.Email;

        return admin.auth().getUserByEmail(userEmail)
            .then(userRecord => {
                const userID = userRecord.uid;
                return admin.auth().deleteUser(userID)
            })
            .catch(error => {
                console.log(error.message);
                return null;
            })

    });
但是请注意,此方法“要求用户最近已登录。如果未满足此要求,请要求用户再次进行身份验证,然后调用
firebase.user.reauthenticateWithCredential
”。
auth/requires recent login
代码出现错误,“如果用户的上次登录时间不符合安全阈值,则会引发此错误”

因此,只有登录的用户才能从前端调用此方法,以删除他/她自己的帐户。

2/使用管理SDK 例如,您可以在云函数中使用AdminSDK的方法

在这种情况下,不需要让用户登录,因为这是在后端执行的,因此可以删除任何用户

例如,管理员用户可以触发一个

另一种可能性是在Firestore用户删除文档时触发云功能


根据您的问题更新更新: 我知道您想在删除时删除身份验证服务中的用户记录。为此,您可以按如下方式编写:

const user = firebase.auth().currentUser;
user.delete()
.then(() => {
   //....
})
.catch(err => {
  if (err.code === "auth/requires-recent-login") {
     //Re-authenticate the user 
  } else {
     //....
  }
})
exports.deleteUser = functions.firestore
    .document('Students/{studentID}')
    .onDelete((snap, context) => {

        const deletedValue = snap.data();
        const userEmail = deletedValue.Email;

        return admin.auth().getUserByEmail(userEmail)
            .then(userRecord => {
                const userID = userRecord.uid;
                return admin.auth().deleteUser(userID)
            })
            .catch(error => {
                console.log(error.message);
                return null;
            })

    });

谢谢雷诺的回答。我的问题是,管理员想从数据库中删除选定的学生,在我的例子中是firestore,然后通过获取文档名,可以删除数据,但电子邮件id仍将存在于身份验证中。所以我想通过登录admin来删除所选的身份验证。意味着,管理员希望删除其他经过身份验证的用户。希望你们明白我的意思。是的,我明白你们的意思:解决方案是使用第二个选项,即管理员触发一个云函数,调用管理员SDK的
deleteUser()
方法。@ArunMishra这听起来像是你们应该添加到问题中的信息(它下面有一个
edit
链接)。整个Firestore的角度完全缺失,这使得很难提供帮助。如何删除Firestore中的用户文档?用户文档的id和结构是什么?请使用编辑链接将此信息添加到您的问题中。嘿,雷诺,我已经编辑了问题。希望这次我能清楚地解释我的疑问。