如何获取触发Firebase Cloud Function onUpdate/onWrite的用户认证信息?
解决Firestore onUpdate触发器中获取用户认证信息的问题
核心结论
Firestore的onUpdate/onWrite触发器的context.auth确实不会填充用户认证信息,因为Firestore触发器本身不传递请求发起者的身份数据。要获取触发操作的用户信息,只能通过业务层埋点或者安全规则配合字段记录的方式实现。
可行方案
方案1:在文档中存储用户身份信息
在更新「trns」集合文档时,主动添加用户的displayName(或UID)到文档字段中,比如新增一个updatedBy字段:
// 前端更新文档时的示例代码 const trnsRef = db.collection('trns').doc('xxx'); await trnsRef.update({ // 其他更新字段 updatedBy: { uid: currentUser.uid, displayName: currentUser.displayName } });
然后在云函数中直接从change.after里读取该字段:
exports.updateTrn = functions.firestore.document("trns/{trnsId}") .onUpdate( (change, context) => { const updatedBy = change.after.data().updatedBy; const displayName = updatedBy?.displayName; console.log('触发更新的用户昵称:', displayName); // 后续业务逻辑 });
注意:要通过Firestore安全规则限制只有合法用户才能写入自己的身份信息,防止伪造:
match /trns/{trnsId} { allow update: if request.auth != null && request.resource.data.updatedBy.uid == request.auth.uid; }
方案2:通过UID拉取用户信息(补充方案)
如果不想在文档中存储displayName,可以只记录用户UID,再在云函数中通过Auth服务拉取完整用户信息:
exports.updateTrn = functions.firestore.document("trns/{trnsId}") .onUpdate( async (change, context) => { const updatedByUid = change.after.data().updatedBy.uid; // 拉取用户信息 const userRecord = await admin.auth().getUser(updatedByUid); const displayName = userRecord.displayName; console.log('触发更新的用户昵称:', displayName); });
为什么context.auth在Firestore触发器中为空?
Firestore触发器是基于文档变更事件触发的,而非直接响应客户端请求。文档变更可能来自前端、其他云函数、Firebase控制台甚至第三方服务,Firebase无法直接关联到具体的发起用户,因此不会填充context.auth字段。
内容的提问来源于stack exchange,提问作者Nxele
相关产品推荐
相关产品推荐

