You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过用户ID而非令牌使用Flutter HTTP访问Firebase实时数据库?

解决Flutter HTTP访问Firebase实时数据库的权限问题

首先得说清楚你当前方案行不通的核心原因:你在URL里加的user_id参数,Firebase的安全规则根本不会把它当作auth.uid来识别。规则里的auth.uid来自Firebase Auth认证后用户令牌里的唯一标识,和URL上挂载的参数完全是两回事,所以规则的权限判断自然无法通过。

下面给你两种可行的解决思路,优先推荐第一种,安全且符合Firebase的设计逻辑:

一、用Firebase Auth认证令牌访问(推荐)

如果你的用户已经通过Firebase Auth完成登录,只需要在HTTP请求里带上用户的ID令牌,就能让安全规则正确识别到auth.uid

  1. 先获取当前登录用户的ID令牌:
final currentUser = FirebaseAuth.instance.currentUser;
final idToken = await currentUser?.getIdToken();
  1. 发起HTTP请求时,把令牌放到请求头里:
final response = await http.get(
  Uri.parse('https://firebaseio-demo.firebaseio.com/Questions/$id.json'),
  headers: {
    'Authorization': 'Bearer $idToken',
  },
);

另外还要检查你的安全规则路径是否匹配实际数据结构:如果你的数据是存在Questions/$user_id节点下,那规则应该调整成这样才正确:

{
  "rules": {
    "Questions": {
      "$user_id": {
        ".read": "$user_id === auth.uid",
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

这样规则就能准确判断当前认证用户的UID是否和节点的$user_id一致了。

二、通过URL参数传递用户ID(不推荐,存在安全风险)

如果确实不想用认证令牌,那得修改安全规则让它读取URL的查询参数,但这种方式完全没有身份验证机制,任何人只要知道user_id就能访问对应数据,风险很高:

  1. 修改安全规则,让它读取URL里的user_id参数:
{
  "rules": {
    "Questions": {
      "$id": {
        ".read": "query.param.user_id === $id",
        ".write": "query.param.user_id === $id"
      }
    }
  }
}
  1. 保持你原来的请求URL写法,但要确保$iduser_id参数的值一致,这样规则才能通过权限判断。

还是强烈建议用第一种方式,既符合Firebase的安全机制,又能保证数据访问的合法性。

内容的提问来源于stack exchange,提问作者x98lol

火山引擎 最新活动