【问题标题】:Why do I not have access to my firebase storage images?为什么我无法访问我的 Firebase 存储映像?
【发布时间】:2020-09-13 23:58:30
【问题描述】:

我有两个图像文件上传到 Firebase 存储:

capsule house.jpg 是通过 UI 上传的(点击上传文件按钮)。

upload_64e8fd... 正在使用这个从我的后端服务器 (node.js) 上传:

const bucket = fbAdmin.storage().bucket('gs://assertivesolutions2.appspot.com');
const result = await bucket.upload(files.image.path);

capsule house.jps 被识别为 jpeg,并且在右侧空白处提供了指向它的链接。如果我单击它,我会在新选项卡中看到我的图像。你可以自己看看:

https://firebasestorage.googleapis.com/v0/b/assertivesolutions2.appspot.com/o/capsule%20house.jpg?alt=media&token=f5e0ccc4-7916-4245-b813-dbdf1838556f

upload_64e8fd... 不被识别为任何类型的图像文件,也没有提供链接。

后端返回的结果是一个巨大的json对象,包含以下字段:

"selfLink": "https://www.googleapis.com/storage/v1/b/assertivesolutions2.appspot.com/o/upload_64e8fd09f787acfe2728ae73158e20ab"
"mediaLink": "https://storage.googleapis.com/download/storage/v1/b/assertivesolutions2.appspot.com/o/upload_64e8fd09f787acfe2728ae73158e20ab?generation=1590547279565389&alt=media"

第一个将我带到这样的页面:

{
  "error": {
    "code": 401,
    "message": "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.",
    "errors": [
      {
        "message": "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.",
        "domain": "global",
        "reason": "required",
        "locationType": "header",
        "location": "Authorization"
      }
    ]
  }
}

第二个给了我类似的东西:

Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.

我的存储桶的规则如下:

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

我允许所有读取和写入。

那么为什么它说当我的图片通过我的后端服务器上传时我无权查看我的图片?

我也想知道为什么它在通过我的后端服务器上传时无法识别为 jpeg,但在通过 UI 上传时却识别为 jpeg,但我想关注此访问问题问题。

谢谢。

【问题讨论】:

  • 只有 Firebase 的客户端(iOS、Android、Web)会生成允许公共访问文件的下载 URL。通过 Node.js 客户端上传文件时,不会生成这样的下载 URL,默认情况下无法访问该文件。见stackoverflow.com/questions/42956250/…
  • 感谢 Frank 和 gso_gabriel 提供的链接。有很多东西要通读,当我读完后我会回到这个线程。只是想事先说声谢谢。

标签: node.js google-cloud-storage firebase-storage


【解决方案1】:

默认情况下,文件以私有方式上传,除非您更改存储桶设置,如 here 所述。以下代码是如何更改文档可见性的示例。

/**
 * {@inheritdoc}
 */
public function setVisibility($path, $visibility)
{
    $object = $this->getObject($path);

    if ($visibility === AdapterInterface::VISIBILITY_PRIVATE) {
        $object->acl()->delete('allUsers');
    } elseif ($visibility === AdapterInterface::VISIBILITY_PUBLIC) {
        $object->acl()->add('allUsers', Acl::ROLE_READER);
    }

    $normalised = $this->normaliseObject($object);
    $normalised['visibility'] = $visibility;

    return $normalised;
}

您可以通过控制台查看如何设置,按照官方文档中的教程进行操作:Making data public

除此之外,正如@FrankvanPuffelen 的评论中所指出的,您将没有生成的 URL 用于访问文件。你可以找到更多关于它的信息here

如果这些信息对您有帮助,请告诉我!

【讨论】:

  • 感谢 gso_gabriel 和 Frank 提供的链接。有很多东西要通读,当我通读它时,我会回到这个线程。只是想事先说声谢谢。
  • 我认为提出生成的 URL 令人困惑。在 ACL 公开文件后,标准 URL http://BUCKET_NAME.storage.googleapis.com/OBJECT_NAME 对我来说是匿名的。
【解决方案2】:

另一个答案帮助了我!如果这些安全规则不适用,我不知道为什么控制台让我制定这些安全规则......

基于nodejs docs(可能还有其他语言),有一种在上传期间公开文件的简单方法:

const result = await bucket.upload(files.image.path, {public: true});

同样的选项适用于 bucket.file().save() 和类似的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 2023-03-19
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多