使用 App Check 保护 API 密钥的安全
Firebase App Check 可通过屏蔽来自合法应用以外来源的流量,为您的应用对 Google Maps Platform 的调用提供保护。为此,它会检查来自证明提供方(例如 Play Integrity)的令牌。将应用与 App Check 集成有助于防范恶意请求,因此您无需为未经授权的 API 调用付费。
App Check 是否适合我?
在大多数情况下,建议使用 App Check,但在以下情况下,不需要或不支持 App Check:
- 您使用的是原始 Places SDK。App Check 仅支持 Places SDK(新)。
- 非公开应用或实验性应用。如果您的应用无法公开访问,则不需要使用 App Check。
- 如果您的应用仅用于服务器到服务器的通信,则无需使用 App Check。不过,如果与 GMP 通信的服务器由公共客户端(例如移动应用)使用,请考虑使用 App Check 保护该服务器,而不是使用 GMP。
- App Check 推荐的证明提供程序无法在被证明提供程序视为存在安全风险或不可信的设备上运行。如果您需要支持此类设备,可以部署自定义认证服务。如需了解详情,请参阅说明。
实现步骤概览
概括来讲,您需要按照以下步骤将应用与 App Check 集成:
- 将 Firebase 添加到您的应用。
- 添加并初始化 App Check 库。
- 添加令牌提供方。
- 启用调试功能。
- 监控应用请求并决定是否强制执行。
与 App Check 集成后,您将能够在 Firebase 控制台中查看后端流量指标。这些指标会按请求是否附带有效的 App Check 令牌来细分请求。如需了解详情,请参阅 Firebase App Check 文档。
当您确定大多数请求来自合法来源,并且用户已更新到包含 App Check 实现的最新版应用后,即可启用强制执行。启用强制执行后,App Check 会拒绝所有没有有效 App Check 令牌的流量。
规划 App Check 集成时的注意事项
在规划集成时,请考虑以下事项:
我们推荐的证明提供方 Play Integrity 的标准 API 用量层级有每日调用次数限制。 如需详细了解调用限制,请参阅 Google Play Integrity 开发者文档中的设置页面。
您也可以选择使用自定义证明提供方,不过这属于高级使用情形。如需了解详情,请参阅实现自定义 App Check 提供方。
-
您的应用的用户在启动时会遇到一些延迟。不过,之后的所有定期重新认证都将在后台进行,用户应该不会再遇到任何延迟。启动时的确切延迟时间取决于您选择的证明提供方。
App Check 令牌的有效时长(即存留时间或 TTL)决定了重新证明的频率。您可以在 Firebase 控制台中配置此时长。当大约一半的 TTL 已过时,系统会重新进行证明。如需了解详情,请参阅您的证明提供方的 Firebase 文档。
将应用与 App Check 集成
前提条件和要求
- 集成了 4.1 版或更高版本的 Places SDK 的应用。
- 应用的 SHA-256 指纹。
- 应用的软件包名称。
- 您必须是 Cloud 控制台中相应应用的所有者。
- 您需要从 Cloud 控制台中获取应用的相应项目 ID
第 1 步:将 Firebase 添加到您的应用
按照 Firebase 开发者文档中的说明将 Firebase 添加到您的应用。
第 2 步:添加 App Check 库并初始化 App Check
如需了解如何使用默认的证明提供方 Play Integrity,请参阅使用入门:将 App Check 与 Play Integrity 搭配使用 (Android)。
- 如果您尚未完成这一步骤,请将 Places SDK 集成到您的应用中。
接下来,初始化 App Check 和 Places 客户端。
// Initialize App Check FirebaseApp.initializeApp(/* context= */ this); FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(); firebaseAppCheck.installAppCheckProviderFactory( PlayIntegrityAppCheckProviderFactory.getInstance()); // Initialize Places SDK Places.initializeWithNewPlacesApiEnabled(context, API_KEY); PlacesClient client = Places.createClient(context);.
第 3 步:添加令牌提供程序
初始化 Places API 后,调用 setPlacesAppCheckTokenProvider()
以设置 PlacesAppCheckTokenProvider
。
Places.initializeWithNewPlacesApiEnabled(context, API_KEY); Places.setPlacesAppCheckTokenProvider(new TokenProvider()); PlacesClient client = Places.createClient(context);.
以下是令牌提取器接口的实现示例:
/** Sample client implementation of App Check token fetcher interface. */ static class TokenProvider implements PlacesAppCheckTokenProvider { @Override public ListenableFuture<String> fetchAppCheckToken() { SettableFuture<String> future = SettableFuture.create(); FirebaseAppCheck.getInstance() .getAppCheckToken(false) .addOnSuccessListener( appCheckToken -> { future.set(appCheckToken.getToken()); }) .addOnFailureListener( ex -> { future.setException(ex); }); return future; } }
第 4 步:启用调试功能(可选)
如果您想在本地开发和测试应用,或在持续集成 (CI) 环境中运行应用,可以创建应用的调试 build,该 build 使用调试密钥来获取有效的 App Check 令牌。这样一来,您就可以避免在调试 build 中使用真实的证明提供方。
如需在模拟器中或在测试设备上运行应用,请执行以下操作:
- 将 App Check 库添加到您的
build.gradle
文件中。 - 在调试 build 中,将 App Check 配置为使用调试提供程序工厂。
- 启动应用,系统会创建一个本地调试令牌。将此令牌添加到 Firebase 控制台。
- 如需了解详情和相关说明,请参阅 App Check 文档。
如需在 CI 环境中运行应用,请执行以下操作:
- 在 Firebase 控制台中创建调试令牌,并将其添加到 CI 系统的安全密钥库中。
- 将 App Check 库添加到您的
build.gradle
文件中。 - 配置 CI build 变体以使用调试令牌。
- 在测试类中,使用
DebugAppCheckTestHelper
封装需要 App Check 令牌的代码。 - 如需了解详情和相关说明,请参阅 App Check 文档。
第 5 步:监控应用请求并决定是否强制执行
在开始强制执行之前,您需要确保不会干扰应用的合法用户。为此,请访问 App Check 指标界面,查看应用的流量中有多少百分比是经过验证的、过时的或非法的。当您发现大部分流量都已通过验证后,即可启用强制执行。
如需了解详情和相关说明,请参阅 Firebase App Check 文档。