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

使用自定义身份验证时如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 10:36:02