【问题标题】:Detect authenticated users in Firestore security rules while using Firebase session cookies在使用 Firebase 会话 cookie 时检测 Firestore 安全规则中经过身份验证的用户
【发布时间】:2020-08-06 13:50:59
【问题描述】:

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

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

但是现在当我使用会话 cookie 系统登录时,Firestore 规则不允许我读取或写入数据并出现“权限被拒绝”错误,因为不再设置 Firestore 请求的 request.auth 对象使用会话 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();
    }
  }
}

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    好的,我在这里找到了解决方案。我没有在服务器端 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 2021-07-05
      • 1970-01-01
      • 2021-07-07
      • 2019-10-17
      • 1970-01-01
      • 2018-10-10
      相关资源
      最近更新 更多