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

时间:2018-03-20 13:30:43

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

是否可以知道云端防火墙文档的传入请求源的主机名?我想写一个allow write: if request.resource.data.source_host_name == some_predefined_value形式的数据库规则。这是一个Web应用程序,所以我试图找到一种方法来限制谁不使用传统的auth方法写入我的数据库。

2 个答案:

答案 0 :(得分:2)

Cloud Firestore无法实现这种规则。它也不会非常安全,因为它可以spoof source IP addresses

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

答案 1 :(得分:1)

这是我与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仿真器不会创建正确的标头。