使用 App Check 保护您的 API 密钥
Firebase App Check 会屏蔽来自合法应用以外来源的流量,从而保护应用对 Google Maps Platform 的调用。它通过从 App Attest 等认证提供程序检查令牌来实现此目的。将应用与 App Check 集成有助于防范恶意请求,以免您因未经授权的 API 调用而被收费。
App Check 是否适合我?
在大多数情况下,我们建议使用 App Check,但在以下情况下不需要或不支持使用 App Check:
- 您使用的是原始的 Google 地图 SDK。App Check 仅适用于 Places SDK(新版)。
- 非公开或实验性应用。如果您的应用不对公众开放,则无需进行应用检查。
- 如果您的应用仅用于服务器到服务器通信,则无需进行应用检查。不过,如果与 GMP 通信的服务器由公共客户端(例如移动应用)使用,请考虑使用 App Check 保护该服务器,而不是 GMP。
- App Check 推荐的证明提供程序无法在被证明提供程序认定为已遭到入侵或不可信的设备上运行。如果您需要支持此类设备,可以部署自定义认证服务。如需了解详情,请参阅说明。
实现步骤概览
概括来讲,您需要按照以下步骤将应用与 App Check 集成:
- 将 Firebase 添加到您的应用。
- 添加并初始化 App Check 库。
- 将令牌提供程序添加到您的应用。
- 初始化 Places API 和 App Check API。
- 启用调试。
- 监控应用请求并决定是否强制执行。
集成 App Check 后,您将能够在 Firebase 控制台中查看后端流量指标。这些指标按请求是否附带有效的 App Check 令牌对请求进行细分。如需了解详情,请参阅 Firebase App Check 文档。
当您确定大多数请求都来自合法来源,并且用户已更新到包含 App Check 实现的最新版应用后,就可以开启强制执行。强制执行启用后,App Check 会拒绝所有没有有效 App Check 令牌的流量。
规划 App Check 集成时的注意事项
在规划集成时,请考虑以下事项:
我们建议的证明提供程序(Device Check 或 App Attest)受 Apple 设置的配额和限制的约束。
您可以选择使用自定义认证提供程序,但这是一种高级用例。如需了解详情,请参阅 Firebase App Check 文档。
-
您的应用用户在启动时会遇到一些延迟。不过,之后,所有定期重新证明都将在后台进行,用户应该不会再遇到任何延迟。启动时的确切延迟时间取决于您选择的认证提供程序。
App Check 令牌的有效时长(存活时间或 TTL)决定了重新证明的频率。您可以在 Firebase 控制台中配置此时长。当 TTL 时长约过半时,系统会进行重新证明。如需了解详情,请参阅适用于您的认证提供程序的 Firebase 文档。
将您的应用与 App Check 集成
前提条件和要求
- 已安装 9.2 版或更高版本的 Places SDK 的应用。
- 应用的软件包 ID。
- 您可以在 Apple Member Center 的“会员”下方找到您的团队 ID。
- 如果您打算使用设备检查功能,请准备好私钥文件和密钥 ID。
- 您必须是 Cloud 控制台中相应应用的所有者。
- 您需要 Cloud 控制台中应用的项目 ID
第 1 步:将 Firebase 添加到您的应用
按照 Firebase 开发者文档中的说明将 Firebase 添加到您的应用。
注册应用后,您会收到一个配置文件 GoogleService-Info.plist
。将此文件(未经修改)添加到应用的根级目录。
Swift
import FirebaseCore import FirebaseAppCheck import GooglePlaces
Objective-C
@import FirebaseCore; @import FirebaseAppCheck; @import GooglePlaces;
第 2 步:添加 App Check 库并初始化 App Check
Firebase 提供了针对每个默认认证提供程序的说明。这些说明介绍了如何设置 Firebase 项目并将 App Check 库添加到您的应用。请按照提供的代码示例初始化 App Check。
- 按照 Firebase 说明添加 App Check 库:
- 初始化 App Check。
- 如果您使用的是 App Attest,请按照 Firebase 开发者文档中有关 App Attest 的部分操作。
按照 Firebase App Check 说明创建
AppCheckProviderFactory
的实现,并将其添加到AppDelegate
文件中。Swift
let providerFactory = YourAppCheckProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory)
Objective-C
YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init]; [FIRAppCheck setAppCheckProviderFactory:providerFactory];
- 如果您使用的是设备检查,请将以下代码添加到
AppDelegate
:Swift
AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())
Objective-C
[FIRAppCheck setAppCheckProviderFactory:providerFactory];
- 如果您使用的是 App Attest,请按照 Firebase 开发者文档中有关 App Attest 的部分操作。
第 3 步:添加令牌提供程序
在应用的根级别创建一个名为 AppCheckTokenProvider
的文件(如果您使用的是 Objective-C,则创建两个名为 AppCheckTokenProvider.h
和 AppCheckTokenProvider.m
的文件)。
添加以下导入语句和类定义:
Swift
// AppCheckTokenProvider.swift import FirebaseAppCheck import Foundation import GooglePlaces class AppCheckTokenProvider: NSObject, GMSPlacesAppCheckTokenProvider { func fetchAppCheckToken() async throws -> String { return try await AppCheck.appCheck().token(forcingRefresh: false).token } }
Objective-C
// AppCheckTokenProvider.h @import Foundation; @import GooglePlaces; @interface AppCheckTokenProvider : NSObject <GMSPlacesAppCheckTokenProvider> @end // AppCheckTokenProvider.m #import "AppCheckTokenProvider.h" @import FirebaseAppCheck; @implementation AppCheckTokenProvider - (void)fetchAppCheckTokenWithCompletion:(nonnull GMSAppCheckTokenCompletion)completion { [[FIRAppCheck appCheck] tokenForcingRefresh:NO completion:^(FIRAppCheckToken *_Nullable token, NSError *_Nullable error) { if (token) { completion(token.token, nil); } else { completion(nil, error); } }]; } @end
第 4 步:初始化地点和应用检查 API
- 在
AppDelegate
文件中,初始化 Places API:Swift
GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
Objective-C
[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
- 然后,初始化 App Check API:
Swift
GMSPlacesClient.setAppCheckTokenProvider(AppCheckTokenProvider())
Objective-C
[GMSPlacesClient setAppCheckTokenProvider:[[AppCheckTokenProvider alloc] init]];
第 5 步:启用调试(可选)
如果您想在本地开发和测试应用,或在持续集成 (CI) 环境中运行应用,则可以创建应用的调试 build,该 build 使用调试密钥来获取有效的 App Check 令牌。这样,您就可以避免在调试 build 中使用真实的认证提供程序。
如需在模拟器或测试设备上测试应用,请执行以下操作:
创建并设置 App Check 调试提供程序工厂。
此代码示例同时处理调试和生产场景:Swift
#if targetEnvironment(simulator) let providerFactory = AppCheckDebugProviderFactory() #else let providerFactory = YourAppCheckProviderFactory() #endif
Objective-C
if (targetEnvironment == simulator){ FIRAppCheckDebugProviderFactory *providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init]; [FIRAppCheck setAppCheckProviderFactory:providerFactory]; } else { YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init]; [FIRAppCheck setAppCheckProviderFactory:providerFactory]; }
- 在 Xcode 项目中启用日志记录,启动应用,然后在日志中找到本地调试令牌。
- 将此令牌添加到 Firebase 控制台。
- 如需了解详情和相关说明,请参阅 App Check 文档。
如需在 CI 环境中运行应用,请执行以下操作:
- 在 Firebase 控制台中创建一个调试令牌,并将其添加到 CI 系统的安全密钥库。
- 在 Xcode 中,向测试方案添加一个环境变量,其名称为
FIRAAppCheckDebugToken
,其值为$(APP_CHECK_DEBUG_TOKEN)
(或类似内容)。 - 在 CI 测试脚本中,将调试令牌作为环境
创建并设置 App Check 调试提供程序工厂。
此代码示例同时处理调试和生产场景:Swift
#if targetEnvironment(ci) let providerFactory = AppCheckDebugProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory) #else let providerFactory = YourAppCheckProviderFactory() #endif
Objective-C
if (targetEnvironment == ci) { FIRAppCheckDebugProviderFactory *providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init]; [FIRAppCheck setAppCheckProviderFactory:providerFactory]; } else { YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init]; [FIRAppCheck setAppCheckProviderFactory:providerFactory]; }
- 如需了解详情和相关说明,请参阅 App Check 文档。
第 6 步:监控应用请求并决定是否强制执行
在开始强制执行之前,您需要确保不会干扰应用的合法用户。为此,请访问 App Check 指标页面,查看应用流量中经过验证、已过时或非法的流量所占的百分比。当您发现大部分流量均已验证后,就可以启用违规处置功能。
如需了解详情和相关说明,请参阅 Firebase App Check 文档。