【问题标题】:Is it possible to determine the source of an incoming request?是否可以确定传入请求的来源?
【发布时间】:2023-07-18 16:39:02
【问题描述】:

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

【问题讨论】:

  • 你能解释一下hostname 是什么意思吗?每个用户都有一个 IP 地址,但没有主机名。您希望达到哪些限制,而 Firebase 身份验证无法做到?
  • @JasonBerryman - 感谢您的提问。由于此特定应用程序的特殊性,无法使用 Firebase 身份验证。可能可以使用匿名身份验证,但我认为这不会提供足够的安全性。我正在寻找一种方法来添加用户来自已知站点的条件。

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


【解决方案1】:

这种规则在 Cloud Firestore 中是不可能的。它也不是很安全,因为可以spoof source IP addresses

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

【讨论】:

  • 感谢您的回复
【解决方案2】:

这是我在与 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"]
  );
}

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

【讨论】:

  • 你好,你如何改变firestore客户端的端点去云功能?谢谢
最近更新 更多