微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于 Firestore 数据的 Firebase 云存储规则变通

如何解决基于 Firestore 数据的 Firebase 云存储规则变通

在我的 firebase 应用程序中

  • 用户列表(所有用户均通过 Firebase 身份验证注册
  • 每个用户的关注者列表
  • 每个用户添加了一张个人资料照片,照片的文件名是唯一的,并保存在名为“photoName”的 firestore 文档中
  • 仅允许用户的关注者阅读“photoName”文档(如 firestore 规则中所指定)

我希望只有关注者能够读取用户的头像,我在云存储中添加了如下规则:

match /profilePhotos/{profilePhotoFile_id} {

  allow read: if request.auth.uid != null

}

云存储规则是在文件级别设置的,所以我假设只有登录用户和关注者才能阅读其他用户的个人资料照片是否准确?除非他们以某种方式神奇地猜出照片的唯一名称

解决方法

我假设只有登录的用户是否准确 并且也是追随者将能够阅读个人资料照片 另一个用户?

否,因为客户端 SDK 可以列出 Cloud Storage 存储分区中的所有文件,因为 explained in the doc 和您的 Cloud Storage 安全规则允许任何经过身份验证的用户读取个人资料照片文件。

>

另请注意,您在编写 Cloud Storage 安全规则时无法读取 Firestore 文档。


一种可能的方法是使用 Cloud Function 生成您存储在 Firestore 文档中的签名 URL AND 以禁止对个人资料照片文件的读取访问。由于 Cloud Functions 使用 Admin SDK,因此它们可以绕过安全规则。

每次将文件添加到 Cloud Storage 并将其保存在 Firestore 文档中时,以下 Cloud Function 代码都会生成一个签名 URL。使用此签名 URL,任何人都可以阅读个人资料照片文件。

您可以通过以下方式使其适应您的情况:

  1. 如有必要,仅处理个人资料照片(检查文件名是否包含 profilePhotos
  2. 在正确的 Firestore 文档中保存 URL:我猜文件名允许链接回用户文档。此外,您可能需要将 add() 更改为 update()

exports.generateFileURL = functions.storage.object().onFinalize(async object => {

    try {
        const bucket = admin.storage().bucket(object.bucket);
        const file = bucket.file(object.name);

        const signedURLconfig = { action: 'read',expires: '08-12-2025' };

        const signedURLArray = await file.getSignedUrl(signedURLconfig);
        const url = signedURLArray[0];

        await admin.firestore().collection('...').add({ signedURL: url })
        return null;
    } catch (error) {
        console.log(error);
        return null;
    }

});

另外两个注意事项:

  • 您可以在 Cloud Storage 安全规则中使用 Custom Claims,但不建议在您的情况下使用它们,请参阅 here
  • 您也可以在 Cloud Storage 安全规则中使用文件元数据,但它同样不适用于您的情况(每次新关注者注册时,您都不会在文件元数据中添加关注者 ID...)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。