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

Firebase实时数据库规则中request.auth载荷传递问题排查

Firebase实时数据库规则权限拒绝问题排查

问题背景

我正在配置Firebase实时数据库的认证规则,尽管查阅了官方文档,仍对规则的运行机制理解不足。目前已完成Firebase认证功能及Cloud Functions的基础配置。

当前规则与核心问题

我设置的规则用于限制用户仅能访问与自身UID匹配的数据库节点:

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

逻辑很明确:数据库路径中的$uid变量需与认证用户的auth.uid完全一致。

但实际请求时,日志始终返回permissions denied(权限拒绝)错误。移除上述规则后,云函数可正常运行,因此确定问题根源在于这条认证规则。

认证流程与代码细节

1. 前端登录获取Token

前端通过以下函数完成登录并获取有效的ID Token:

export const signIn = async (email, password) => {
  try {
    await setPersistence(auth, browserLocalPersistence);
    const userCredential = await signInWithEmailAndPassword(
      auth,
      email,
      password
    );

    const user = userCredential.user;
    const token = await user.getIdToken(true);
    return { user, token };
  } catch (error) {
    return { error: error.message };
  }
};

2. 后端中间件验证Token

前端将Token以Bearer格式放在请求头中发送至云函数,后端通过中间件验证并解码Token:

const idToken = req.headers.authorization.split("Bearer ")[1];
await adminApp
  .auth()
  .verifyIdToken(idToken)
  .then((decodedIdToken) => {
    req.auth = decodedIdToken;
    next();
  })
  .catch((error) => {
    console.log(error);
    res.status(403).send(`Unauthorized ${error.message}`);
  });

验证通过后,打印req.auth可获取完整的解码数据(敏感信息已打码):

{
 name: 'Fake user',
 iss: '---',
 aud: '---',
 auth_time: 1669298408,
 user_id: '---',
 sub: '---',
 iat: 1669342950,
 exp: 1669346550,
 email: '---',
 email_verified: true,
 firebase: { identities: { email: [Array] }, sign_in_provider: 'password' },
 uid: '---'
}

3. 数据库请求代码

解码完成后,使用用户UID发起数据库请求:

console.log("GET ALL", req.auth);

const { uid } = req.auth;

get(child(dbRef, `${uid}/workouts`))
  .then((snapshot) => {
    if (snapshot.exists()) {
      return snapshot.val();
    } else {
      console.log("No workouts available");
      return null;
    }
  })

疑问

Token验证已通过,请求路径中的UID与req.auth.uid完全匹配,但规则仍判定权限不足,请问问题出在哪里?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:50:32