使用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
相关产品推荐
相关产品推荐

