我正在我的实时数据库中设置我的auth规则(在firebase中),但是尽管阅读了文档,我对它是如何工作的理解还是很弱。
我已经在firebase和firebase函数中设置了身份验证。
我正在努力解决的特定规则是确认访问数据库中零件的用户:
"$uid":{
".write": "$uid === auth.uid",
".read": "$uid === auth.uid",
},
简单地说,路径是否等于身份验证ID?
我有一个合适的auth令牌作为头进入后端,并且使用中间件检索它:
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: '---'
}
(这里显然是经过审查的)
使用此函数:
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;
}
})
我知道这与上面的规则有关,因为记录的错误是permissions denied
类型。当我没有适当的规则时,该函数也工作得很好。
1条答案
按热度按时间bkkx9g8r1#
decodedIdToken.uid
确实与这些安全规则中的ID相同。但是,无论如何,当通过其中一个Admin SDK访问时,安全规则都会被完全绕过。此外,我建议您看一下示例express中间件函数:
validateFirebaseIdToken()
(因为您的版本在授权头不存在时将抛出未捕获的异常)