我应该将来自Firebase的google-services.json文件添加到我的代码库中吗?

162

我刚刚注册了Firebase并创建了一个新的项目。Firebase要求我提供应用程序域和SHA1调试密钥。我输入了这些细节信息,它生成了一个google-services.json文件,让我将其添加到我的应用程序模块根目录中。

我的问题是,这个.json文件应该添加到公共(开源)存储库中吗?它是否应该像API密钥一样保密?

5个回答

145

一个google-services.json文件,来自Firebase文档

Firebase通过单个配置文件管理您的所有API设置和凭据。
该文件在Android上命名为google-services.json,在iOS上命名为GoogleService-Info.plist

将其添加到.gitignore中并不包含在公共存储库中似乎是有道理的。
这在issue 26中进行了讨论,其中更详细地介绍了{{link4:google-services.json}}包含的内容。

googlesamples/google-services 这样的项目,例如 .gitignore
尽管,如 评论stepheaw 所指出,这个 线程提到了

对于库或开源示例,我们不包括 JSON 文件,因为意图是让用户插入自己的文件来将代码指向他们自己的后端。
这就是为什么在我们大多数 Firebase 存储库中都看不到 JSON 文件的原因。

如果 "数据库URL、Android API密钥和存储桶" 对您来说不是机密,那么您可以考虑将文件添加到您的仓库中。
正如 "google-services.json 是否安全免受黑客攻击?" 中所提到的,这并不简单。 baueric评论 中问道:

在那篇文章中,他说:

JSON 文件不包含任何超敏感信息(比如服务器 API 密钥)

但是 google-services.json 有一个名为 api_key 的条目。
这是与 "服务器 API 密钥" 不同的 API 密钥吗?

Willie Chalmers III指向“Google-services.json是否安全免受黑客攻击?”,并补充说:

是的,那个API密钥不是应该保密的服务器API密钥,所以如果您的google-services.json被其他人看到也没关系。

无论如何,您仍然应该限制Google Cloud控制台中客户端API密钥的使用方式。


正如Puzz评论中所指出的那样,还可以参考"将Firebase apiKey公开安全吗?"

在那个答案中,Frank Van Puffelen提到:

更新(2021年5月):由于名为Firebase App Check的新功能,现在实际上可以将对Firebase项目中后端服务的访问限制为只有来自在该特定项目中注册的iOS、Android和Web应用程序的访问。


27
这实际上是不正确的;一位Firebase工程师表示,将其检入源代码控制是可以的。@Yaron的答案依然适用。 - Willie Chalmers III
2
@WillieChalmersIII 好的,我已经相应地修改了答案。 - VonC
1
@baueric 请查看答案以获取更多信息。是的,那个API密钥不是服务器API密钥,因此不应该公开,所以如果您的google-services.json被其他人看到也没关系。无论如何,您仍然应该限制Google Cloud控制台中客户端API密钥的使用方式。 - Willie Chalmers III
在这里,您可以看到更详细的解释。https://dev59.com/zVoU5IYBdhLWcg3wamca#37484053 - Hyo
1
@Puzz 谢谢您的反馈。我已经在答案中包含了您的评论和参考,以增加其可见性。 - VonC
显示剩余2条评论

63

根据讨论,看起来您可以将其添加到公共存储库中。 它的内容最终会出现在APK中,并且可能很容易被提取。


1
我同意,并且我正在解决这个问题。有没有一种方法可以加密该文件中的密钥,以防止有人反编译APK? - stepheaw
24
虽然API密钥可以很容易地从apk中提取,但问题是关于是否应该在“公共开源存储库”中提交 google-services.json。在绝大多数情况下,答案绝对是否定的 - 除非存储库所有者希望整个世界默认使用他们的Google账户API配额。@VonC的回答是正确的。 - friederbluemle
2
hitraj47 询问如何将其添加到公共存储库。该讨论并未提及公共存储库,他们似乎在讨论私有存储库。 - Eugene
请注意,可以使用签名和签署来保护密钥。因此,其他人无法在没有您的签名密钥的情况下使用密钥,所以不必担心他们看到密钥。 - FindOutIslamNow
你能解释一下吗?如果我用另一个密钥来保护这个密钥,那么最终我的应用程序需要第二个密钥才能使用第一个密钥。所以我最终还是面临着在代码库中存储该密钥的问题。 - Yaron
顺便提一下,当在GitHub上创建项目并选择预定义的示例时,默认情况下会将'google-services.json'添加到'.gitignore'文件中。 - soulflavacrew

5

这个文件的内容是公开的,Firebase文档中有说明:Firebase文档

The content of the Firebase config file or object is considered 
public, including the app's platform-specific ID (Apple bundle ID or
Android package name) and the Firebase project-specific values, like
the API Key, project ID, Realtime Database URL, and Cloud Storage 
bucket name. Given this, use Firebase Security Rules to protect your
data and files in Realtime Database, Cloud Firestore, and Cloud Storage.

2

1

回复 @Yaron 的最后一条评论。 根据我有限的 firebase 知识和使用经验。

在 firebase 项目控制台中(您可以在其中下载 google-services.json 并获取 API 密钥),您需要提供应用程序 ID,并提供 SHA 证书。 因此,为了使请求起作用,它必须来自与相同应用程序 ID 和证书对应的应用程序。

因此,在代码库中没有第二个密钥可隐藏。后端进行验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接