【问题标题】:Getting 403 Forbidden error when trying to load image from Firebase Storage尝试从 Firebase 存储加载图像时出现 403 Forbidden 错误
【发布时间】:2017-06-16 01:54:54
【问题描述】:

我正在使用 Firebase 存储来为我的 Android 应用上的用户存储和加载图像。所有用户在使用之前都必须经过身份验证。有时,某些用户个人资料图像未显示并引发“403 Forbidden”错误。这些图像以前显示过,我不确定它们为什么停止工作。 我在我的 firebase 存储上使用以下规则:

 service firebase.storage {
   match /b/<storage_address>.appspot.com/o {
    match /{allPaths=**} {
     allow read: if request.auth != null;
     allow write: if request.auth != null;
    }
  }
}

如果我将读取规则更改为allow read;,所有图像都可以正常工作。 这是我的展示方式:

Picasso.Builder builder = new Picasso.Builder(this);
                builder.listener(new Picasso.Listener()
                {
                    @Override
                    public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception)
                    {
                        exception.printStackTrace();
                    }
                });
                builder.build().load(URL).into(imgView);

图片 URL 如下所示:

https://firebasestorage.googleapis.com/v0/b/<storage_address>.appspot.com/o/images%2Fprofile%2Fphoto%2F36805?alt=media&token=e62ec151-3aaf-4e5c-aefb-1b3c93828684

这可能与令牌有关吗?

【问题讨论】:

  • 您是否使用StorageReference.getDownloadUrl() 将URL 传递给builder.build().load(URL)?如果是这样,我不知道更改安全规则会如何影响行为。通过此 URL 访问文件是公开的,不受规则控制。
  • 我怀疑 403 错误不是图像下载的结果,而是其他原因,例如您调用获取下载 URL。发布用于获取 URL 的代码。

标签: android firebase firebase-storage


【解决方案1】:

可能来得太晚了,但可能对其他人有帮助。我有同样的问题,我的问题是 firebase 存储中的文件名是唯一的。如果您上传具有相同文件名的新文件,它将覆盖旧文件并为其生成新令牌,从而使旧网址过时。 你应该为你上传的文件生成一个唯一的文件名,然后它应该被修复。

【讨论】:

  • 你是怎么做到的?我在 IOS 项目中遇到了同样的问题!
  • 我只是将当前时间戳附加到文件名。
  • 在我的文件中,我使用相同的名称。为了让它对我有用,我删除了当前的 ref 并使用相同的文件名上传,它似乎可以工作。
  • 您的回复确实非常非常有用!!!
  • 非常有用!帮我解决了
【解决方案2】:

如果您只是测试存储,您可能还没有实现身份验证。默认情况下,存储期望上传用户经过身份验证。为了绕过它,在 Storage->Rules 中写下:

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

对我来说就像一个魅力。玩得开心使用 Firebase

【讨论】:

  • 注意:这应该只适用于开发模式,大多数人可能会推荐一些身份验证来上传文件
【解决方案3】:

如果您的文件扩展名不正确或丢失,您会收到以下错误:

 {
    "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
    }
 }

在您提供的图片网址中,图片名称后没有图片扩展名。

我已经用我的一个网址进行了测试,这是可行的(你可以测试): https://firebasestorage.googleapis.com/v0/b/training-a0a3e.appspot.com/o/penguin-56101_640.jpg?alt=media&token=8dfb913d-e2f3-4956-bd3a-2c3746d0d6d3

但是,当 .jpg 被删除时: https://firebasestorage.googleapis.com/v0/b/training-a0a3e.appspot.com/o/penguin-56101_640?alt=media&token=8dfb913d-e2f3-4956-bd3a-2c3746d0d6d3

收到以下响应:

 {
    "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
    }
 }

【讨论】:

  • 好的,如果您可以编辑有效的文件。似乎我的问题是 Facebook 的一些限制。我一开始以为是这个。
【解决方案4】:

向所有人授予读取权限让我的应用再次正确显示图像:

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

可能不建议这样做,但暂时解决了问题

【讨论】:

    【解决方案5】:

    我和你有同样的问题。这是一个迟到的答案,但也许这可以帮助某人。

    对我来说,问题与user2555964 描述的完全一样。

    我可以看到您只提供了 url 并且它引用了一个令牌。我假设您不会从 this 之类的存储路径下载 url,而只是将引用保存在数据库中。

    我的详细问题是,在上传图片时,我保存了 url 并将其保存在数据库中,然后我有一个存储触发器,优化了 firebase 云功能(复制、优化和替换原始图片)上的图片,这改变了图片的令牌,在检查存储规则上的身份验证时,使 url 上的令牌毫无价值。

    我的解决方案是存储存储路径并使用正确的令牌下载当前 url。

    【讨论】:

    • 我也有同样的问题。当用户留下带有个人资料图片的评论,然后更改它时,评论中的图片不会更新,我会收到该错误。您能否详细说明如何存储路径,以便令牌会随着替换而更新?
    猜你喜欢
    • 2015-12-04
    • 2022-11-01
    • 2020-07-09
    • 2017-04-25
    • 2014-05-22
    • 2017-01-11
    • 2016-09-29
    • 2017-07-22
    相关资源
    最近更新 更多