是否可以确定传入请求的来源?

adb*_*dbo 2 firebase firebase-security google-cloud-firestore

是否可以知道对云 Firestore 文档的传入请求来源的主机名?我想写一个表单的数据库规则allow write: if request.resource.data.source_host_name == some_predefined_value。这是一个 Web 应用程序,因此我试图找到一种好方法来限制谁可以在不使用传统身份验证方法的情况下写入我的数据库。

Dou*_*son 6

Cloud Firestore 无法实现这种规则。它也不会很安全,因为它可能会欺骗源 IP 地址

如果您想限制谁可以访问您的数据库,唯一支持的机制是通过安全规则和 Firebase 身份验证。


Wil*_*itz 5

这是我在与 Firestore 交互时记录客户端 IP 地址的解决方案。我同意 Doug 的观点,即这不能防止 IP 欺骗。尽管如此,它对我的​​目的还是有帮助的。

诀窍是使用 Cloud Functions 创建中间 API 端点,然后与 Firestore 进行交互。以下是 Google Cloud 函数的示例。

const admin = require("firebase-admin");
const functions = require("firebase-functions");

admin.initializeApp();

exports.yourEndpoint = functions.https.onRequest(req, (res) => {
  // Get the IP address from the headers in the request object
  const ipAddress = getIPAddress(req);

  // Do whatever you need in your firestore DB with ipAddress
  admin.firestore().collection('ipAddresses').add({address: ipAddress})
    .then((writeResult) => {
      return res.status(200).send();
    })
    .catch((error) => {
      return res.status(500).send();
    });
});

// Helper function to extract the IP address from request headers
function getIPAddress(req) {
  return (
    req.headers["fastly-client-ip"] ||
    req.headers["x-forwarded-for"] ||
    req.headers["No IP, probably because we are in development mode"]
  );
}

Run Code Online (Sandbox Code Playgroud)

注意:在开发模式下您不会获得 IP 地址,因为 Firebase 模拟器不会创建正确的标头。