Flutter使用Firebase Realtime DB安全规则无法读取更新后displayName
排查步骤
- 首先处理ID Token缓存问题
Firebase Auth的鉴权JWT Token默认会本地缓存1小时,调用updateProfile仅会更新本地用户对象的字段,不会自动刷新缓存的Token,安全规则读取的auth对象完全来源于请求携带的Token,因此会拿到更新前的旧值。
解决方式是在updateProfile执行完成后,主动调用getIdToken(true)强制刷新Token,刷新完成后再发起数据库操作,示例代码如下:
// 执行资料更新 await referencedData.firebaseAuth.currentUser.updateProfile( displayName: 'gameName' ); // 强制刷新鉴权Token,同步最新用户字段到后端 await referencedData.firebaseAuth.currentUser.getIdToken(true); // 再执行后续数据库写入/更新操作
- 校验安全规则取值逻辑
可以在规则中使用debug()函数打印变量值,再通过Firebase控制台的实时数据库规则测试面板,传入用户当前的有效Token模拟请求,确认auth.displayName的实际取值是否符合预期:
".write": "!data.exists() || debug(auth.displayName) == debug(data.child('gamename').val())"
测试时可直接看到两个变量的实际输出,能快速定位是Token字段未更新还是规则匹配逻辑错误。
确认异步操作时序
必须保证updateProfile、getIdToken两个异步操作都完全执行完成后,再发起数据库请求,避免因异步await缺失导致请求仍携带旧Token。校验初始写入数据一致性
首次创建路径数据时,规则通过!data.exists()放行,此时需要确保写入的gamename字段值和当前用户的displayName完全一致,否则后续更新时会出现匹配失败的问题。
内容的提问来源于stack exchange,提问作者Derek Davidson
相关产品推荐
相关产品推荐

