firebase request.auth负载是如何传递到实时数据库的规则中的?

yxyvkwin  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在我的实时数据库中设置我的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类型。当我没有适当的规则时,该函数也工作得很好。

bkkx9g8r

bkkx9g8r1#

decodedIdToken.uid确实与这些安全规则中的ID相同。但是,无论如何,当通过其中一个Admin SDK访问时,安全规则都会被完全绕过。
此外,我建议您看一下示例express中间件函数:validateFirebaseIdToken()(因为您的版本在授权头不存在时将抛出未捕获的异常)

相关问题