使用 App Check 保护 API 密钥(新)
Firebase App Check 会屏蔽来自合法应用以外来源的流量,从而保护应用对 Google Maps Platform 的调用。为此,它会检查来自 reCAPTCHA Enterprise 等认证提供程序的令牌。将应用与 App Check 集成有助于防范恶意请求,以免您因未经授权的 API 调用而被收费。
App Check 是否适合我?
在大多数情况下,我们建议使用 App Check,但在以下情况下不需要或不支持使用 App Check:
- 非公开或实验性应用。如果您的应用不对公众开放,则无需进行应用检查。
- 如果您的应用仅用于服务器到服务器通信,则无需进行应用检查。不过,如果与 GMP 通信的服务器由公共客户端(例如移动应用)使用,请考虑使用 App Check 保护该服务器,而不是 GMP。
实现步骤概览
概括来讲,您需要按照以下步骤将应用与 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 集成时的注意事项
在规划集成时,请考虑以下事项:
- 我们建议您使用 reCAPTCHA Enterprise 进行认证,如果每月评估次数超过 1 万次,则需要付费。
我们推荐的另一个认证提供程序 reCAPTCHA v3 设有配额,超出配额后系统将不会对流量进行评估。
您可以选择使用自定义认证提供程序,但这是一种高级用例。如需了解详情,请参阅 App Check 文档。
-
您的应用用户在启动时会遇到一些延迟。不过,之后,所有定期重新证明都将在后台进行,用户应该不会再遇到任何延迟。启动时的确切延迟时间取决于您选择的认证提供程序。
App Check 令牌的有效时长(存活时间或 TTL)决定了重新证明的频率。您可以在 Firebase 控制台中配置此时长。当 TTL 时长约过半时,系统会进行重新证明。如需了解详情,请参阅适用于您的认证提供程序的 Firebase 文档。
将您的应用与 App Check 集成
前提条件和要求
- 已加载 最新的每周或每季度版本的 Maps JS API、Core 和 Places 库的应用。
- 启用了 Maps JS API 和 Places API(新版)API 的 Cloud 项目。
- 您必须是 Cloud 控制台中相应应用的所有者。
- 您需要 Cloud 控制台中应用的项目 ID
第 1 步:将 Firebase 添加到您的应用
按照 Firebase 开发者文档中的说明将 Firebase 添加到您的应用。
第 2 步:添加 App Check 库并初始化 App Check
Firebase 提供了针对每个默认认证提供程序的说明。这些说明介绍了如何设置 Firebase 项目并将 App Check 库添加到您的应用。请按照提供的代码示例初始化 App Check。
第 3 步:加载 Maps JS API 库
加载核心库、Google 地图库和地点库,如以下代码段所示。如需了解详情和相关说明,请参阅 Maps JavaScript API 地点类文档。
async function init() { const {Settings} = await google.maps.importLibrary('core'); const {Map} = await google.maps.importLibrary('maps'); const {Place} = await google.maps.importLibrary('places'); }
第 4 步:初始化地点和应用检查 API
- 使用 Firebase 控制台提供的配置初始化 App Check。
- 确保向 Maps JS API 发出的请求附带 App Check 令牌:
async function init() { const {Settings} = await google.maps.importLibrary('core'); const {Map} = await google.maps.importLibrary('maps'); const {Place} = await google.maps.importLibrary('places'); const app = initializeApp({ // Your firebase configuration object }); // Pass your reCAPTCHA Enterprise site key to initializeAppCheck(). const appCheck = initializeAppCheck(app, { provider: new ReCaptchaEnterpriseProvider( 'abcdefghijklmnopqrstuvwxy-1234567890abcd', ), // Optional argument. If true, the SDK automatically refreshes App Check // tokens as needed. isTokenAutoRefreshEnabled: true, }); Settings.getInstance().fetchAppCheckToken = () => getToken(appCheck, /* forceRefresh = */ false); // Make a Places JS request const place = new Place({id: 'ChIJN5Nz71W3j4ARhx5bwpTQEGg'}); await place.fetchFields({fields: ['*']}); // Load a map map = new Map(document.getElementById("map"), { center: { lat: 37.4161493, lng: -122.0812166 }, zoom: 8, }); }
第 5 步:启用调试(可选)
如果您想在本地开发和测试应用,或在持续集成 (CI) 环境中运行应用,则可以创建应用的调试 build,该 build 使用调试密钥来获取有效的 App Check 令牌。这样,您就可以避免在调试 build 中使用真实的认证提供程序。
如需在本地测试应用,请执行以下操作:
- 启用调试提供程序以进行开发。
- 您将从 SDK 的调试日志中收到自动生成的随机 UUID4(在 App Check 文档中称为“调试令牌”)。将此令牌添加到 Firebase 控制台。
- 如需了解详情和相关说明,请参阅 App Check 文档。
如需在 CI 环境中运行应用,请执行以下操作:
- 在 Firebase 控制台中生成一个随机 UUID4。
- 将 UUID4 添加为调试令牌,然后将其复制到 CI 测试在每次运行测试时都会访问的密钥库中。
- 如需了解详情和相关说明,请参阅 App Check 文档。
第 6 步:监控应用请求并决定是否强制执行
在开始强制执行之前,您需要确保不会干扰应用的合法用户。为此,请访问 App Check 指标页面,查看应用流量中经过验证、已过时或非法的流量所占的百分比。当您发现大部分流量均已验证后,就可以启用违规处置功能。
如需了解详情和相关说明,请参阅 Firebase App Check 文档。