使用 App Check 保护您的 API 密钥
Firebase App Check 可屏蔽来自合法应用以外的流量,为您的应用对 Google Maps Platform 的调用提供保护。为此,它会检查来自 Play Integrity 等证明提供方的令牌。将应用与 App Check 集成,有助于防范恶意请求,让您不会为未经授权的 API 调用付费。
App Check 是否适合我?
在大多数情况下,我们建议使用 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 集成
前提条件和要求
- 已集成 Places SDK 4.1 或更高版本的应用。
- 应用的 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 文档。