2016-12-04 34 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