You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:09:00