Google Firebase RealtimeDB按UID配置规则后请求返回401错误排查
问题原因
- 核心错误为身份认证凭证传递错误:代码中将
currentUser.uid(用户唯一标识字符串)误作为ID令牌赋值给idToken变量,放在Authorization请求头中传给Firebase。Firebase REST API要求Bearer后跟随合法的JWT身份令牌,而非用户UID,因此身份校验不通过返回401未授权错误。 - 潜在问题:注释中提到的
this.currentUser.getIdToken()为异步方法,若未添加await调用会拿到Promise对象而非有效令牌,也会导致认证失败。 - 你当前配置的数据库规则符合「仅允许用户读写自身UID节点」的需求,规则本身没有问题。
解决方案
方案1:修复现有axios调用逻辑
仅修改ID令牌的获取代码即可:
async getData () { const messageRef = this.$fire.database.ref(this.currentUser.uid) // 替换原来的uid赋值逻辑,调用getIdToken获取合法JWT令牌 const idToken = await this.currentUser.getIdToken() const response = await axios.get( messageRef.toString() + '.json', { headers: { Authorization: `Bearer ${idToken}` } } ) this.$store.commit('ON_WATCHLIST_CHANGE', response.data.watchlist) if (response.data.watchlist.companies.includes(this.$route.params.company) || response.data.watchlist.drugs.includes(this.$route.params.comound)) { this.$store.commit('CURRENT_PAGE_CHECK', true) } },
方案2:直接使用Firebase SDK请求(更推荐)
你已经引入了Firebase SDK(代码中使用了this.$fire.database),无需手动调用REST接口和处理认证头,SDK会自动完成身份凭证传递,代码更简洁稳定:
async getData () { const messageRef = this.$fire.database.ref(this.currentUser.uid) // 调用SDK自带方法获取节点数据 const snapshot = await messageRef.once('value') const responseData = snapshot.val() this.$store.commit('ON_WATCHLIST_CHANGE', responseData.watchlist) if (responseData.watchlist?.companies?.includes(this.$route.params.company) || responseData.watchlist?.drugs?.includes(this.$route.params.comound)) { this.$store.commit('CURRENT_PAGE_CHECK', true) } }
内容的提问来源于stack exchange,提问作者Joaquin684
相关产品推荐
相关产品推荐

