Flutter使用Google Cloud Functions Firestore触发器获取UID问题
解决方案1:在业务文档中存储操作人UID(最常用方案)
这是目前官方推荐的替代方案,实现成本最低:
- 第一步:客户端执行
trainings文档的新增/删除操作时,额外写入operatorUid字段存储当前登录用户的UID - 第二步:配置Firestore安全规则强制校验该字段的合法性,避免用户伪造他人UID,规则示例:
match /users/{userId}/trainings/{trainingId} { allow create: if request.auth != null && request.resource.data.operatorUid == request.auth.uid; allow delete: if request.auth != null && resource.data.operatorUid == request.auth.uid; // 其他权限逻辑自行补充 }
- 第三步:在Cloud Function触发器中直接读取该字段即可拿到操作人UID,修改后的代码如下:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); const {FieldValue} = require("@google-cloud/firestore/build/src"); admin.initializeApp(functions.config().functions); // 原硬编码用户ID改为从路径参数取,适配多用户场景 exports.countDocs = functions.firestore .document('/users/{userId}/trainings/{trainings}') .onWrite((change, context) => { // 从路径参数拿到归属用户ID const docPathUserId = context.params.userId; // 从文档中取实际操作人的UID const operatorUid = change.after.exists ? change.after.data().operatorUid : change.before.data().operatorUid; // 动态生成计数文档路径 const countDoc = admin.firestore().collection('users').doc(docPathUserId).collection('user').doc('general'); if (!change.before.exists) { countDoc.update({numberOfDocs: FieldValue.increment(1)}); } else if (!change.after.exists) { countDoc.update({numberOfDocs: FieldValue.increment(-1)}); } });
解决方案2:用可调用云函数封装读写操作
如果不想在业务文档里加额外字段,可以放弃使用Firestore触发器,把文档的新增、删除逻辑全部封装到Firebase可调用云函数中,可调用云函数可以直接通过context.auth.uid拿到当前请求用户的UID,示例代码:
// 新增training文档的可调用函数 exports.addTraining = functions.https.onCall(async (data, context) => { // 直接拿到当前用户UID const uid = context.auth.uid; if (!uid) throw new functions.https.HttpsError('unauthenticated', '请先登录'); // 执行新增逻辑 await admin.firestore().collection('users').doc(uid).collection('trainings').add(data.trainingData); // 同时更新计数 await admin.firestore().collection('users').doc(uid).collection('user').doc('general').update({ numberOfDocs: FieldValue.increment(1) }); return {success: true}; });
删除逻辑同理封装即可,客户端直接调用对应云函数执行操作,不要直接读写Firestore,即可稳定获取操作用户UID。
内容的提问来源于stack exchange,提问作者LazyTurtle
相关产品推荐
相关产品推荐

