如何在不使用 firebase 身份验证的情况下保护 firebase 存储? (下一个)

How to secure firebase storage without using firebase auth? (nextjs)

我使用 firebase 存储在我的 next.js 页面中上传文件。客户填写表格,文件将上传到 firebase 存储中。 (我正在使用不同的数据库)

我想知道如何只允许在此 post 请求中上传文件。

import React, { useState } from "react";
import { render } from "react-dom";
import { storage } from "../src/firebase/index";

const ReactFirebaseFileUpload = () => {
  const [image, setImage] = useState(null);
  const [url, setUrl] = useState("");
  const [progress, setProgress] = useState(0);

  const handleChange = e => {
    if (e.target.files[0]) {
      setImage(e.target.files[0]);
    }
  };

  const handleUpload = () => {
    const uploadTask = storage.ref(`images/${image.name}`).put(image);
    uploadTask.on(
      "state_changed",
      snapshot => {
        const progress = Math.round(
          (snapshot.bytesTransferred / snapshot.totalBytes) * 100
        );
        setProgress(progress);
      },
      error => {
        console.log(error);
      },
      () => {
        storage
          .ref("images")
          .child(image.name)
          .getDownloadURL()
          .then(url => {
            setUrl(url);
          });
      }
    );
  };

  return (
    <div>
      <progress value={progress} max="100" />
      <br />
      <br />
      <input type="file" onChange={handleChange} />
      <button onClick={handleUpload}>Upload</button>
      <br />
      {url}
      <br />
      <img src={url || "http://via.placeholder.com/300"} alt="firebase-image" />
    </div>
  );

}

export default ReactFirebaseFileUpload;

这是我使用开放规则的工作示例。

我的规则:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

我想把上传放在next.jsapi路由系统上,所以我们有一个api可以调用。在我的想象中,要么我可以用 headers 或其他东西以某种方式保护这部分,或者甚至可以更好地在我的存储规则中定义一些东西。

我真的没有找到任何聪明的定义。

求指导帮我扔这个

如果任何人(没有授权)需要上传数据,您需要授予他 write 访问您存储中特定 path 的权限。

要从 ref 中获取 donwloadURL,它需要 read 权限。

如果根据您的业务逻辑,任何人都可以上传但不需要 downloadURL,您可以删除每个人的 read

我肯定会建议在特定 path 下上传此类文件,例如“public”,并且至少像此处对图像进行文件大小和内容类型的限制:

match /public/{allPaths=**} {
        allow read: if true
        allow write: if request.resource.size < 15 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*') 
    }

不要忘记 downloadURL 是对每个文件的 public 访问 URL。因此,拥有 URL 的任何人都可以访问该文件。您需要 read 规则才能从引用中获取 downloadURL,但如果您从其他地方获取 downloadURL,您仍然可以访问该文件。它们的制作方式不容易质疑它们,因此这是一种非常安全的方法。

如果可以的话,您可以使用管理 SDK 自行完成,只需 return downloadURL 或使用带有存储触发器的 Firebase Cloud Functions 来监听文件上传(访问受限像上面一样)并将 downloadURL 存储在你需要的地方。

Here 你很好地解释了所有这些如何协同工作。