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

实施自定义 App Check 提供程序

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

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 端点,但具体细节由您决定。

创建令牌获取端点

  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客户端使用它。