App Check 内置了对多个提供程序的支持:Apple 平台上的 DeviceCheck 和 App Attest,Android 上的 Play Integrity 和 SafetyNet,以及 web 应用程序中的 reCAPTCHA v3 和 reCAPTCHA Enterprise。 (概述)。这些是很好理解的提供者,应该可以满足大多数开发人员的需求。但是,您也可以实现自己的自定义 App Check 提供程序。在以下情况下需要使用自定义提供程序:
您想使用内置提供程序以外的提供程序。
您想以不受支持的方式使用内置提供程序。
您希望使用 Apple、Android 和 Web 以外的平台验证设备。例如,您可以为桌面操作系统或物联网设备创建 App Check 提供程序。
您想在任何平台上实现自己的验证技术。
概述
要实现自定义 App Check 提供程序,您需要一个可以运行 Node.js Firebase Admin SDK的安全后端环境。这可以是 Cloud Functions、 Cloud Run等容器平台或您自己的服务器。
在此环境中,您将提供可访问网络的服务,该服务从您的应用程序客户端接收真实性证明,并且如果真实性证明通过了您的真实性评估,则返回一个 App Check 令牌。您用作真实性证明的特定指标将取决于您使用的第三方提供商,或者您自己发明的指标(如果您正在实施自定义逻辑)。
通常,您将此服务公开为 REST 或 gRPC 端点,但此细节取决于您。
创建令牌获取端点
创建一个可从您的客户端接收真实性数据的网络可访问端点。例如,使用云函数:
// Create endpoint at https://example-app.cloudfunctions.net/fetchAppCheckToken exports.fetchAppCheckToken = functions.https.onCall((authenticityData, context) => { // ... });
添加到评估真实性数据的端点逻辑。这是您的自定义 App Check 提供程序的核心逻辑,您需要自己编写。
如果您确定客户端是真实的,请使用 Admin SDK 生成一个 App Check 令牌并将其及其到期时间返回给客户端:
const admin = require('firebase-admin'); admin.initializeApp(); // ... admin.appCheck().createToken(appId) .then(function (appCheckToken) { // Token expires in an hour. const expiresAt = Math.floor(Date.now() / 1000) + 60 * 60; // Return appCheckToken and expiresAt to the client. }) .catch(function (err) { console.error('Unable to create App Check token.'); console.error(err); });
如果无法验证客户端的真实性,则返回错误(例如,返回 HTTP 403 错误)。
可选:通过将
AppCheckTokenOptions
对象传递给createToken()
。您可以将 TTL 设置为 30 分钟到 7 天之间的任何值。设置此值时,请注意以下权衡:- 安全性:较短的 TTL 可提供更强的安全性,因为它减少了泄露或拦截的令牌可能被攻击者滥用的窗口。
- 性能:较短的 TTL 意味着您的应用将更频繁地执行证明。由于应用程序证明过程每次执行都会增加网络请求的延迟,因此较短的 TTL 可能会影响应用程序的性能。
对于大多数应用程序来说,1 小时的默认 TTL 是合理的。
下一步
既然您已经实现了自定义提供程序的服务器端逻辑,请了解如何从您的Apple 、 Android和Web客户端使用它。