使用自定义身份验证时如何编写Firebase安全规则?
解决方案
你设想的直接传递isAuthorized布尔值的方案完全不可行,客户端可以随意将该参数构造为true绕过所有校验,没有任何安全价值。推荐采用Firebase官方提供的自定义令牌方案适配你的Django自定义身份系统,具体实现如下:
实现步骤
1. Django后端生成Firebase自定义令牌
首先在Django项目中安装Firebase Admin SDK,用户完成你的自定义身份校验后,为其生成对应唯一ID的Firebase自定义JWT令牌:
import firebase_admin from firebase_admin import auth # 初始化Firebase Admin,全局仅需执行一次 cred = firebase_admin.credentials.Certificate("你的Firebase服务账号密钥文件路径") firebase_admin.initialize_app(cred) # 用户通过Django身份校验后生成令牌,返回给前端 custom_token = auth.create_custom_token(uid="当前用户的唯一标识ID")
2. 前端用自定义令牌完成Firebase身份认证
前端拿到Django返回的自定义令牌后,调用Firebase客户端API完成登录,后续所有Firebase数据库/存储请求会自动携带身份信息,无需手动传参:
import { getAuth, signInWithCustomToken } from "firebase/auth"; const auth = getAuth(); signInWithCustomToken(auth, 后端返回的custom_token) .then((userCredential) => { // 登录成功,可正常发起Firebase请求 }) .catch((error) => { // 处理令牌失效、校验失败等异常 });
3. 配置Firebase安全规则
直接使用Firebase内置的auth全局变量做身份校验,所有请求会自动校验身份有效性,不需要你手动处理token解析逻辑:
{ "rules": { // 仅通过身份校验的用户可读写全库 ".read": "auth != null", ".write": "auth != null", // 如需细粒度权限控制,比如仅允许用户读写自己的数据,可以按下方配置 // "user_data": { // "$user_id": { // ".read": "$user_id === auth.uid", // ".write": "$user_id === auth.uid" // } // } } }
优化建议
- 如需角色类权限控制,可以在生成自定义令牌时添加自定义声明,比如
auth.create_custom_token(uid="xxx", custom_claims={"role": "admin"}),之后在安全规则中通过auth.token.role校验角色权限 - 自定义令牌默认有效期为1小时,前端需要监听Firebase身份状态变化,令牌过期后重新向后端请求新的自定义令牌刷新身份
- 所有权限校验必须下沉到Firebase安全规则层,不要在客户端侧做权限判断,避免客户端被篡改后绕过校验
内容的提问来源于stack exchange,提问作者Utkarsh Tyagi
相关产品推荐
相关产品推荐

