尝试从Firebase存储加载图像时出现403 Forbidden错误

时间:2017-01-30 19:23:16

标签: android firebase firebase-storage

我使用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);

图片网址如下所示:

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

这可能与令牌有关吗?

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

如果文件的扩展名不正确或丢失,则会出现以下错误:

string_input_producer

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

我已经使用我的一个网址进行了测试,这可行(您可以测试): API

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

收到以下回复:

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

答案 2 :(得分:2)

如果您只是测试存储,则可能未实现身份验证。默认情况下,Storage期望上载用户进行身份验证。要绕过它,在Storage-&gt;规则中写下这个:

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

对我来说就像一个魅力。使用Firebase获得乐趣

答案 3 :(得分:1)

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

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

可能不推荐这样做,但暂时解决了问题

答案 4 :(得分:0)

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

对我来说,问题完全符合user2555964所述。

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

我的详细问题是,上传图片后,我将网址保存并保存在数据库中,然后使用存储触发器对Firebase云功能(复制,优化和替换原始图片)进行了优化,从而更改了图片。图片的令牌,在检查存储规则的auth时使url上的令牌毫无价值。

对我来说,解决方案是存储存储路径,然后下载带有正确令牌的当前URL。