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

Firestore权限规则:如何通过自定义令牌实现待办列表共享?

问题解答

首先,你提到的直接在Firestore安全规则中读取request.{my_access_token}的方式是不可行的——Firestore的request对象并不支持自定义属性,规则无法直接获取你自行传入的自定义令牌参数。

下面是几种更合理的实现方案,你可以根据共享场景选择:

方案一:基于Firebase自定义身份验证实现安全共享

适合临时或有过期需求的共享场景:

  1. 当列表所有者生成共享链接时,后端(或安全的云函数)生成一个自定义JWT令牌,令牌中嵌入该列表的accessToken或直接绑定列表ID。
  2. 被分享用户打开链接后,应用使用这个自定义令牌完成Firebase Auth登录。
  3. 修改Firestore安全规则,同时支持所有者验证和令牌验证:
match /lists/{list} {
  allow read, edit: if request.auth != null && 
    (request.auth.uid == resource.data.ownerId || 
     request.auth.token.accessToken == resource.data.accessToken);
}

这种方式符合Firebase的安全模型,你还可以给自定义令牌设置过期时间,提升安全性。

方案二:通过共享用户UID列表实现长期授权

适合需要长期共享给特定注册用户的场景:

  1. 在lists集合的文档中新增sharedUserUids数组字段,用于存储被授权用户的Google登录UID。
  2. 所有者分享时,让对方先登录你的应用(用Google账号),然后将对方的UID添加到目标列表的sharedUserUids中。
  3. 安全规则修改为:
match /lists/{list} {
  allow read, edit: if request.auth != null && 
    (request.auth.uid == resource.data.ownerId || 
     request.auth.uid in resource.data.sharedUserUids);
}

这种方式无需额外生成令牌,直接基于用户身份授权,管理起来更直观。

方案三:结合查询参数的令牌校验

适合快速临时共享,无需用户额外登录授权的场景(注意:令牌需妥善保管,避免泄露):

  1. 共享链接携带accessToken参数,如www.myapp.com/join?token=xxx。
  2. 客户端在请求Firestore时,必须在查询条件中加入accessToken == [传入的令牌]。
  3. 修改安全规则,校验用户已登录且查询参数匹配:
match /lists/{list} {
  allow read, edit: if request.auth != null && 
    (request.auth.uid == resource.data.ownerId || 
     (resource.data.accessToken != null && 
      request.query.token == resource.data.accessToken));
}

需要注意的是,必须强制客户端请求时带上令牌查询条件,否则规则会拒绝访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:25:30