了解面向 Cloud Storage 的 Firebase 安全规则

安全性通常是应用开发过程中最复杂的部分之一。在大多数应用中,开发者所构建和运行的服务器必须能够处理身份验证(用户是谁)和授权(用户可以做什么)这两大问题。 建立身份验证和授权机制本身就十分困难,要确保正确则更加困难,而这直接关系到您的产品能否取得成功。

Firebase Authentication 让您能够轻松验证用户身份,与之类似,面向 Cloud Storage 的 Firebase 安全规则可以为您简化向用户授权和验证请求的工作。Cloud Storage 安全规则允许您指定基于路径的权限,降低了复杂性。只需几行代码,您就可以编写出授权规则,用于限定能够发出 Cloud Storage 请求的用户身份,或限制上传文件的大小。

Firebase Realtime Database 具有类似的功能,称为 Firebase Realtime Database 安全规则

身份验证

了解您的用户是谁,这是构建应用时需要考虑的一个重要方面,Firebase Authentication 提供了一种易于使用且安全的纯客户端侧身份验证解决方案。面向 Cloud Storage 的 Firebase 安全规则与 Firebase Authentication 相结合,可以实现基于用户的安全性。当使用 Firebase Authentication 对某个用户进行了身份验证后,Cloud Storage 安全规则中的 request.auth 变量会变成一个包含该用户唯一 ID (request.auth.uid) 和令牌 (request.auth.token) 中所有其他用户信息的对象。当用户未通过身份验证时,request.auth 则为 null。这可以让您针对每个用户安全地控制数据访问。如需了解详情,请参阅身份验证部分。

授权

识别用户身份只是安全工作的一部分。在知道用户的身份后,您需要一种方法来控制该用户对 Cloud Storage 中的文件的访问权限。

Cloud Storage 允许您指定基于文件和路径的授权规则(这些规则驻留在服务器上),以及确定对您应用中的文件的访问权限。例如,默认的 Cloud Storage 安全规则需要借助 Firebase Authentication 才能对所有文件执行任何 readwrite 操作:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

您可以前往 Firebase 控制台选择一个 Firebase 应用并查看“Storage”部分的 Rules 标签页,来修改这些规则。

数据验证

面向 Cloud Storage 的 Firebase 安全规则也可用于数据验证,包括验证文件名和路径以及文件元数据属性(例如 contentTypesize)。

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

后续步骤