You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用data.auth.uid处理Firestore数据删除是否安全?

问题

我正在使用Google Cloud Function处理Firestore数据删除,代码如下:

exports.deleteAccount = https.onCall(
    async (data, auth) => {
        const uid = data.auth.uid;
        // ...
       
    }
);

我的Firestore数据库中用户文档ID与用户UID一致,请问使用data.auth.uid来处理删除操作是否安全?即未认证用户或其他用户能否传入不同的UID?

Flutter应用中的调用代码如下:

HttpsCallable callable =
        FirebaseFunctions.instanceFor(region: 'asia-southeast1')
            .httpsCallable('deleteAccount');
    await callable();
回答

首先要纠正你代码里的关键错误:Cloud Functions的onCall函数中,用户的认证信息存储在第二个参数auth里,而非data对象中。你当前通过data.auth.uid获取UID的做法完全不安全——任何用户都可以手动构造data参数传入任意UID,甚至未登录的用户也能这么操作,直接导致越权删除他人的Firestore文档。

正确的安全实现方式是从auth参数中获取UID,同时先校验用户是否已认证:

exports.deleteAccount = https.onCall(
    async (data, auth) => {
        // 拦截未认证请求
        if (!auth) {
            throw new functions.https.HttpsError('unauthenticated', '用户未登录,无法执行删除操作');
        }
        // 从认证上下文获取安全的UID
        const uid = auth.uid;
        // 执行对应文档的删除操作
        await admin.firestore().collection('users').doc(uid).delete();
        return { success: true, message: '账号删除成功' };
    }
);

这种方式安全的核心原因:

  • auth参数是Firebase Auth验证身份令牌后生成的结果,客户端无法篡改其中的uid,只能拿到当前登录用户的真实UID
  • 未认证用户调用时auth会返回null,可以直接拒绝请求,避免匿名操作

再看你的Flutter调用代码,没有传入任何data是正确的——因为UID不需要客户端传递,Cloud Function会自动从用户的认证上下文获取。即使客户端强行传入UID,在正确的代码逻辑里也不会被使用,完全不影响安全性。

总结关键要点:

  • 绝对不要从客户端传入的data中获取UID,必须使用auth.uid
  • 必须先检查auth是否存在,拦截未认证请求
  • 这样就能彻底杜绝未认证用户或其他用户越权删除的风险

内容的提问来源于stack exchange,提问作者Emmanuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:46:16