使用Firebase会话Cookie时,在Firestore安全规则中检测经过身份验证的用户

时间:2020-04-23 09:28:06

标签: firebase cookies google-cloud-firestore firebase-authentication firebase-security

此处的Firestore安全规则存在一些问题。我有一个使用Firebase和Firestore的带有自定义API的React / Redux SPA。

我目前正在使用Firebase官方文档(https://firebase.google.com/docs/auth/admin/manage-cookies)中所述的会话cookie。因此,当我登录时,将设置cookie并将其与随后的请求一起发送给API,这没问题。

但是现在,当我使用会话cookie系统登录时,由于不再设置Firestore请求的request.auth对象,因此Firestore规则不允许我读取或写入带有“权限被拒绝”错误的数据会话cookie系统...

如何在Firestore安全规则中检测用户是否通过会话cookie进行了身份验证?

使用会话cookie在我的Firebase外部API中

登录路由:

login(req, res) {
auth.setPersistence(firebase.auth.Auth.Persistence.NONE);
auth.signInWithEmailAndPassword(req.query.email, req.query.password)
  .then((response) => response.user.getIdToken().then((idToken) => {
    const expiresIn = 60 * 15 * 1000;
    admin.auth().createSessionCookie(idToken, { expiresIn })
      .then((sessionCookie) => {
        const options = { maxAge: expiresIn, httpOnly: true, secure: !!process.env.NODE_ENV === 'production' };
        res.cookie('session', sessionCookie, options);
        auth.signOut();
        res.json(response);
      }, () => {
        res.status(401).write('Error while verifying token.');
      });
  })).catch((err) => {
    console.error(err);
  });
},

基本用户使用Firestore获得相同的API;登录后立即在请求标头中设置了cookie的情况下调用了该调用:

get(req, res) {
  const { uid } = req;
  db.collection('users').doc(uid).get().then((doc) => {
    res.json(doc.data());
  })
  .catch((err) => {
    console.log(req.path);
    console.error(err);
    res.json(err);
  });
},

权限被从Firestore安全规则拒绝:

Error [FirebaseError]: Missing or insufficient permissions.

我需要使用的旧Firestore安全规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignedIn() {
      return request.auth != null;
    }
    match /users/{userId} {
      allow create, update, get: if isSignedIn();
    }
    match /medic/{medicId} {
      allow create, read: if isSignedIn();
    }
  }
}

非常感谢!

1 个答案:

答案 0 :(得分:0)

好的,所以我在这里找到了解决方案。我没有在服务器端API中使用Firebase Admin SDK,这就是为什么检查Firestore安全规则的原因,因为系统认为这是客户端请求。

我必须限制Firestore安全规则中的所有操作,然后使用Firebase Admin SDK在API中执行数据库操作(显然,由于未使用Firestore安全规则,因此我需要自己检查数据和身份验证;但是通过Firebase会话Cookie,情况已经如此

在深入研究安全规则时,您最终会发现Firebase Admin SDK的请求不受规则限制。 Admin SDK使用服务帐户进行了初始化,从而使SDK可以完全访问您的数据。在Firebase实时数据库中,您可以将Admin SDK的权限划分为用户ID,并照常执行规则。但是其他产品,最著名的是Google Cloud Firestore,尚不支持此功能。在实施服务器端数据访问操作时,应注意这一点。

请参阅:https://firebase.googleblog.com/2019/03/firebase-security-rules-admin-sdk-tips.html