获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

实施自定义 App Check 提供程序

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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 端点,但此细节取决于您。

创建令牌获取端点

  1. 安装并初始化 Admin SDK

  2. 创建一个可从您的客户端接收真实性数据的网络可访问端点。例如,使用云函数:

    // Create endpoint at https://example-app.cloudfunctions.net/fetchAppCheckToken
    exports.fetchAppCheckToken = functions.https.onCall((authenticityData, context) => {
      // ...
    });
    
  3. 添加到评估真实性数据的端点逻辑。这是您的自定义 App Check 提供程序的核心逻辑,您需要自己编写。

  4. 如果您确定客户端是真实的,请使用 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 错误)。

  5. 可选:通过将AppCheckTokenOptions对象传递给createToken() 。您可以将 TTL 设置为 30 分钟到 7 天之间的任何值。设置此值时,请注意以下权衡:

    • 安全性:较短的 TTL 可提供更强的安全性,因为它减少了泄露或拦截的令牌可能被攻击者滥用的窗口。
    • 性能:较短的 TTL 意味着您的应用将更频繁地执行证明。由于应用程序证明过程每次执行都会增加网络请求的延迟,因此较短的 TTL 可能会影响应用程序的性能。

    对于大多数应用程序来说,1 小时的默认 TTL 是合理的。

下一步

既然您已经实现了自定义提供程序的服务器端逻辑,请了解如何从您的AppleAndroidWeb客户端使用它。