我正在通过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"
}
}
我认为该标记也适用于Firebase存储,而不仅仅是此页面中标题为“用户私有”或“群组私有”下提及的Firebase数据库。请看一看。 https://firebase.google.com/docs/storage/security/user-security 我知道存储空间提供了一个不可猜测的下载网址,您可以直接从Firebase控制台 - >对象属性 - >“下载网址” 。问题是只要有人知道下载网址,就没有基于用户的访问保护这样的事情:任何人都可以查看内容,因此没有办法保护它 – Philonoist
我的用例如下=> 我想只要你在我的朋友组,就与我分享我的视频。一旦你离开我的朋友组,我不想与你分享任何内容,并只将内容限制在同一组中的其他朋友。 但在这种情况下,即使您不再是我的朋友组的一部分,并且您已经拥有了视频网址,您仍然可以继续访问该视频。 – Philonoist