关于Firebase存储,我有几个问题吗?
我正在使用和admin帐户(具有自定义声明)为Firebase存储对象生成下载URL,并将该URL存储在Firestore中。
用户可以阅读Firestore文档来获取URL,而不必在客户端代码上调用getDownloadUrl。
Q1)我注意到存储URL的末尾有一个令牌。这是特定于我的管理员帐户吗?是否安全,没有管理员用户现在可以读取此令牌?
Q2)此外,如果非管理员用户在同一存储路径上调用getDownloadUrl,他们会收到与管理员帐户相同的URL或另一个帐户吗?
Q3)如果我切换到客户端使用getDownloadUrl,这会在使用Firebase存储时增加我的成本吗?
Q4)如果我通过URL缓存内容并且URL更改,它将重新下载而不使用缓存。这些下载链接是唯一的还是getDownloadURL可以在后续调用中返回不同的URL?
非常感谢
编辑---
对不起,我还有一个问题
Q5)要在Firebase存储上移动文件,我目前将它们下载到本地PC并重新上传到另一个位置-效率很低。
我似乎有人在使用file.move()(可以看到here。)
是否可以调用firebase函数(因为他们说存储规则是注释中的一个问题,尽管从2016年开始),如果这样的话,这比我的手动下载和上传便宜吗?
很抱歉有很多问题:)
答案 0 :(得分:2)
问题1),我注意到存储URL的末尾有一个令牌。这是我的管理员帐户专用的吗?是否安全,没有管理员用户现在可以读取此令牌?
此令牌是为此特定文件生成的随机ID。除非您有意更改它,否则它不会更改(您可以从Firebase控制台“撤消”该令牌,它将用新的令牌替换它)。拥有URL的每个人都可以查看文件,无论他们是否经过身份验证。但是,该URL是“很难猜测的”,因此,除非您与任何人共享,否则从实际上讲,它将是秘密的。
问题2)此外,如果在同一存储路径上名为getDownloadUrl的非管理员用户会收到与管理员帐户相同的URL或另一个帐户?
除非您在Firebase控制台中使它无效,否则返回的URL将始终相同。如果您不希望客户端调用文件上的getDownloadURL,请添加一个拒绝读取的存储安全规则:
match /path/to/{file} {
allow read: if false;
// Or, if only authed users should be able to call getDownloadURL:
allow read: if request.auth != null;
}
问题3)如果我在客户端上使用getDownloadUrl,使用Firebase存储时会增加成本吗?
对getDownloadUrl()的调用确实利用了一些Google Cloud资源,无论您是在服务器端还是客户端,都必须付费。这是“ B级”操作(请检查Google Cloud定价),并且需要一点数据传输。
问题4)如果我通过URL缓存内容并且URL更改,它将重新下载而不使用缓存。这些下载链接是唯一的还是getDownloadURL可以在后续调用中返回不同的URL? >
每次都返回相同的URL,除非您手动使令牌无效。 (顺便说一下,在您上传对象时,设置Cache-Control
标头的缓存策略已在对象上设置为元数据。)
问题5)要在Firebase存储上移动文件,我目前将它们下载到本地PC并重新上传到其他位置-效率很低。 [..]可以在firebase函数中调用
是的,您可以在Firebase Cloud Function中移动文件。 Firebase Admin SDK绕过安全规则。
答案 1 :(得分:0)
1)我注意到存储URL的末尾有一个令牌。这是我的管理员帐户专用的吗?是否安全,没有管理员用户现在可以读取此令牌?
这取决于您目前拥有的内容,因为您可以将自定义身份验证与Firebase集成在一起,这将允许您创建自定义令牌,这些令牌可用于在客户端应用程序上登录Firebase身份验证服务并采用令牌所描述的身份要求。在访问其他Firebase服务(例如Cloud Storage等)时可以使用此功能。 通常,您的服务器应创建带有唯一标识符的自定义令牌。
2)而且,如果非管理员用户在同一存储路径上名为getDownloadUrl,他们会收到与管理员帐户相同的URL或另一个帐户吗?
取决于您如何设置getDownloadUrl的权限。如果您有一个定制的实例,他们可以收到一个不同的实例,但是通常它会返回一个指向当前引用的新实例。
3)如果我切换到客户端使用getDownloadUrl,使用Firebase存储时会增加成本吗?
对此我不确定,我已经检查了文档,没有任何东西可以表明该特定方法的配额或价格,因此我继续假设它不会这样做,但是我对此可能是错的一个。
4)如果我通过URL缓存内容并且URL更改,它将重新下载而不使用缓存。这些下载链接是唯一的还是getDownloadURL可以在后续调用中返回不同的URL?
如前所述,它将返回一个指向当前引用的新实例,因此这些下载链接是唯一的。
5)要将文件移至Firebase存储器上,我目前将它们下载到本地PC上,然后将其重新上传到另一个位置-效率很低。
对于这个问题以及您初始文章的最后一部分,我建议您创建一个支持票证,并向Firebase支持团队询问更多详细信息,在此您可以获取有关此信息的更多信息,因为它比StackOverflow更适合他们。 (https://firebase.google.com/support)