我使用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
这可能与令牌有关吗?
答案 0 :(得分:11)
可能来得太晚了,但也许对其他人有帮助。我遇到了同样的问题,我的问题是firebase存储中的文件名是唯一的。如果您上传一个具有相同文件名的新文件,它将覆盖旧文件并为其生成新标记,使旧网址过时。 您应该为上传的文件生成唯一的文件名,然后修复它。
答案 1 :(得分:3)
如果文件的扩展名不正确或丢失,则会出现以下错误:
string_input_producer
在您提供的图片网址中,图片名称后面的图片没有扩展名。
我已经使用我的一个网址进行了测试,这可行(您可以测试): API
收到以下回复:
{
"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。