App Check 内置了对多个提供商的支持:Apple 平台上的 DeviceCheck 和 App Attest,Android 上的 Play Integrity 和 SafetyNet,以及网络应用程序中的 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客户端使用它。