2017-01-30 80 views
2

我正在使用firebase存儲爲我的android應用上的用戶存儲和加載圖片。所有用戶在使用之前都必須經過認證。偶爾,某些用戶配置文件圖像不會顯示並拋出「403 Forbidden」錯誤。那些圖像顯示之前,我不知道他們爲什麼停止工作。 我使用我的火力存儲以下規則:嘗試從Firebase存儲中加載圖片時出現403禁止的錯誤

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 

難道是與令牌?

+0

您是否使用StorageReference.getDownloadUrl()傳遞給'builder.build().load(URL)'的URL?如果是這樣,我不知道如何改變安全規則會影響行爲。通過此URL訪問文件是公開的 - 不受規則控制。 –

+0

我懷疑403錯誤不是圖片下載的結果,而是別的,比如您打電話來獲取下載URL。發佈您用於獲取URL的代碼。 –

回答

0

您會收到以下錯誤,如果你的文件的擴展名不正確或丟失:

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

在您提供沒有擴展名的圖像名稱後的圖像的圖像URL。

我與我的網址的一個測試,這個工作(可以測試): 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" 
    } 
} 
1

可能來得太晚,但也許對別人有幫助。我遇到了同樣的問題,我的問題是Firebase存儲中的文件名是唯一的。如果您上傳具有相同文件名的新文件,它將覆蓋舊文件併爲其生成一個新標記,從而使舊標記過時。 你應該爲你上傳的文件生成一個唯一的文件名,然後它應該被修復。

0

如果您只是測試存儲,您可能沒有實現身份驗證。默認情況下,存儲預期上傳用戶進行身份驗證。要繞過這一點,在存儲 - >規則中寫道:

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

工作就像一個魅力對我來說。使用Firebase獲得樂趣

相關問題