2016-12-04 90 views
0

我正在通過url和自定義訪問令牌下載受訪問受保護圖像時遇到問題。Firebase存儲:使用http url路徑和自定義訪問令牌下載訪問受保護的圖像

驗證錯誤:

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

有一些配置我失蹤?

我使用的訪問具有作爲查詢參數的自定義標記圖像

HTTP網址:

https://myfirebasestorage.googleapis.com/v0/b/myfirebasestorage-my_proj_id.appspot.com/o/images%2FIMG_4138.JPG?alt=media&token=TOKEN_GOT_USING_CREATE_CUSTOM_TOKEN_SIGN_IN 

我的存儲規則:

service firebase.storage { 
    match /b/myfirebasestorage-my_proj_id.appspot.com/o { 
    match /{allPaths=**} { 
     allow read: if request.auth != null; 
    } 
    } 
} 

在下面的Java應用程序生成自定義令牌:

public static String createCustomToken(String userId, Map<String, Object> additionalClaims) { 
    FirebaseOptions options = new FirebaseOptions.Builder() 
     .setServiceAccount(new FileInputStream(FIREBASE_ACCESS_FILE)).build(); 
    FirebaseApp.initializeApp(options); 

    Task<String> customToken = FirebaseAuth.getInstance().createCustomToken(userId, additionalClaims); 
    return customToken.getResult().toString(); 
    } 

我能夠驗證相同標記的真實性。使用FirebaseAuth.getInstance()verifyIdToken(idToken)和日誌輸出Java應用程序如下:

VerifiedToken=>uid: user_id_1, 
email: [email protected], 
additionalClaims: { 
    "aud": "myfirebasestorage-<my_proj_id>", 
    "auth_time": 1480609782, 
    "email": "[email protected]", 
    "email_verified": false, 
    "exp": 1480621773, 
    "iat": 1480618173, 
    "iss": "https://securetoken.google.com/myfirebasestorage-my_proj_id", 
    "sub": "user_id_1", 
    "circleId": "circle_id_1", 
    "memberId": "user_id_1", 
    "user_id": "user_id_1", 
    "firebase": { 
    "identities": { 

    }, 
    "sign_in_provider": "custom」 
    } 
} 

簽約,與來自Web客戶端代碼這個自定義的令牌後,我可以看到如下的正確響應

{ 
    "uid": "user_id_1", 
    "displayName": null, 
    "photoURL": null, 
    "email": null, 
    "emailVerified": false, 
    "isAnonymous": false, 
    "providerData": [], 
    "apiKey": "API_KEY", 
    "appName": "[DEFAULT]", 
    "authDomain": "myfirebasestorage-<my_proj_id>.firebaseapp.com", 
    "stsTokenManager": { 
    "apiKey": "API_KEY", 
    "refreshToken": "REFRESH_TOKEN_FROM_FIREBASE", 
    "accessToken": "ACCESS_TOKEN_FROM_FIREBASE", 
    "expirationTime": 1480621773681 
    }, 
    "redirectEventId": null 
} 

注:我能夠訪問使用相同的自定義如下令牌火力數據庫中的節點。

https://myfirebasestorage-my_proj_id.firebaseio.com/games/basic_info.json?orderBy=%22owner_id%22&limitToFirst=30&auth=ACCESS_TOKEN_FROM_FIREBASE 

我的數據庫規則

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

回答

2

簡短的回答是,那?token=<UUID>使用Storage不一樣的?auth=<Firebase Auth JWT or Database Secret>Realtime Database用途(因此他們不同的名稱)。

存儲提供https://myfirebasestorage.googleapis.com/v0/b/<BUCKET>/o/<OBJECT>?alt=media&token=<UNGUESSABLE_UUID>格式的不可猜測的下載網址,該網址旨在與未使用Firebase身份驗證的用戶共享(想象與您的家人/朋友分享照片,但不想讓他們下載應用去做吧)。

如果你想擁有的存儲安全規則保護的下載,你需要使用的getBytes()getStreamgetFile()per the docs原生的Android方法。

+0

我認爲該標記也適用於Firebase存儲,而不僅僅是此頁面中標題爲「用戶私有」或「羣組私有」下提及的Firebase數據庫。請看一看。 https://firebase.google.com/docs/storage/security/user-security 我知道存儲空間提供了一個不可猜測的下載網址,您可以直接從Firebase控制檯 - >對象屬性 - >「下載網址」 。問題是隻要有人知道下載網址,就沒有基於用戶的訪問保護這樣的事情:任何人都可以查看內容,因此沒有辦法保護它 – Philonoist

+0

我的用例如下=> 我想只要你在我的朋友組,就與我分享我的視頻。一旦你離開我的朋友組,我不想與你分享任何內容,並只將內容限制在同一組中的其他朋友。 但在這種情況下,即使您不再是我的朋友組的一部分,並且您已經擁有了視頻網址,您仍然可以繼續訪問該視頻。 – Philonoist