删除用户的可调用云功能是否会被滥用,以便仅通过 ID 删除用户?

Could a callable cloud function that delete users be abused so it can delete users by only id?

我在前端有一个可调用的云函数,它从前端获取子用户 ID 并将其传递给云函数,然后云函数删除该用户并从集合中删除他的文档。 ..

我的问题是有人可以获取某个用户的 ID 并使用该功能并开始使用此功能弹出请求以左右删除用户吗?

这可能会不遵循任何规则运行是有道理的,所以我认为如果以错误的方式实施,这将是一个主要的安全风险,不知道如何提高这方面的安全性并防止任何滥用企图。

前端可调用函数

const functions = getFunctions();
const deleteClient = httpsCallable(functions, 'deleteClient');
      
deleteClient({ uid: 'clientId' })
     .then((result: any) => {
      // Read result of the Cloud Function.
      /** @type {any} */
      //  const data = result.data;
      // const sanitizedMessage = data.text;
      console.log(result);
     })
     .catch((err: any) => {
     alert(err);
   });

云函数

export const deleteClient = functions.https.onCall((data, context) => {
  admin
    .auth()
    .deleteUser(data.uid)
    .then(() => {
      console.log('Successfully deleted user');
    })
    .catch((error: any) => {
      console.log('Error deleting user:', error);
    });

  db.collection('ClientsData').doc(data.uid).delete();
});

听起来您确实造成了安全风险,这也正是为什么 Firebase 身份验证只允许在其 client-side SDK 中删除当前 signed-in 用户的原因。

您必须在 Cloud Functions 代码中实施某种授权方案。这需要两个步骤:

  1. 将发出呼叫的 signed-in 用户的身份从客户端传递到服务器,并在那里使用它来确定谁在发出呼叫。由于您使用的是 Callable Cloud Functions,这已经为您完成,用户在您的 Cloud Functions 代码中的 context.auth 变量中可用。
  2. 判断用户是否被授权执行该操作。这通常是通过拥有授权用户列表,然后检查拨打电话的 context.auth.uid 是否在该列表中来完成的。当然,该列表也可以存储在您的数据库中,这样您就可以在不更改代码的情况下更新它。