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
相关产品推荐
相关产品推荐

