Firebase Storage单用户作为访问控制接口的可行性及令牌互斥问询
关于Firebase UID与令牌分发的两个问题解答
1. 能否通过单个Firebase UID为所有用户分发令牌控制Storage访问?
直白点说:绝对不建议这么做,会引发严重的安全和权限管理问题。
Firebase的身份令牌(不管是ID令牌还是自定义令牌)都是和特定UID绑定的,这个UID代表一个唯一的用户身份。如果所有用户共用同一个UID,会出现这些麻烦:
- 所有用户的操作都会被标记成同一个用户的行为,你根本没法区分是谁上传了文件、修改了资源;
- Firebase Storage的安全规则没法做细粒度控制,比如没法限制用户只能上传到自己的专属路径;
- 任何持有这个UID令牌的用户,都能随意操作其他用户上传的内容——比如删除、修改别人的文件,完全没有资源隔离性。
更合理的替代方案
既然你的自有系统已经有成熟的认证机制和上千用户,推荐给每个自有用户映射一个唯一的Firebase UID:
- 用Firebase Admin SDK的
createCustomToken(uid)方法,为每个自有用户生成对应的自定义令牌; - 用户拿到自定义令牌后,通过Firebase客户端SDK交换成ID令牌,之后用这个令牌访问Storage;
- 配置Storage安全规则,实现用户间的资源隔离,比如只允许用户上传到
/users/{uid}/路径下:rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /users/{uid}/{allPaths=**} { allow write: if request.auth.uid == uid; allow read: if request.auth.uid == uid; } } }
2. 用户A与B同时请求同一Firebase UID的令牌,B的请求会使A的令牌失效吗?
答案是:默认不会。
Firebase ID令牌的有效期是1小时,只要在有效期内,旧令牌依然能正常使用。生成新的令牌(不管是通过自定义令牌交换,还是用户重新登录)并不会主动作废之前的令牌,除非你主动调用Firebase Admin SDK的revokeRefreshTokens(uid)方法。
这里要额外提醒:
- 如果A和B用同一个UID的令牌操作Storage,他们的行为都会被认定为同一个用户的操作,彼此能看到、修改对方的上传内容;
- 哪怕生成了新的令牌,A的旧令牌在过期前仍然可以正常使用,直到自动失效。
总结下来,用单个UID给所有用户分发令牌完全不符合Firebase身份认证的设计逻辑,还会带来巨大的安全隐患,一定要给每个用户分配独立的UID来做身份隔离。
内容的提问来源于stack exchange,提问作者Mateus
相关产品推荐
相关产品推荐

