Catch up on everthing we announced at this year's Firebase Summit. Learn more

实现自定义 App Check 提供程序

App中检查有内置的支持几个供应商:DeviceCheck和App的Attest在苹果平台上,安全网,在Android上或Web应用程序验证码V3(概述)。这些是易于理解的提供程序,应该可以满足大多数开发人员的需求。但是,您也可以实现自己的自定义 App Check 提供程序。在以下情况下需要使用自定义提供程序:

  • 您想使用 Apple 上的 DeviceCheck 或 App Attest、Android 上的 SafetyNet 或 Web 应用程序中的 reCAPTCHA 以外的提供程序。

  • 您想使用 Apple、Android 和 Web 以外的平台验证设备。例如,您可以为桌面操作系统或物联网设备创建 App Check 提供程序。

  • 您想在任何平台上实施自己的验证技术。

概述

要实现自定义应用程序检查提供商,你需要一个安全的后端环境,能够运行Node.js的火力地堡管理员SDK 。这可能是云功能,容器平台,比如云中运行,或者你自己的服务器。

在此环境中,您将提供可访问网络的服务,该服务从您的应用程序客户端接收真实性证明,如果真实性证明通过您的真实性评估,则返回一个 App Check 令牌。如果您正在实施自定义逻辑,您用作真实性证明的特定指标将取决于您使用的第三方提供商或您自己发明的指标。

通常,您将此服务公开为 REST 或 gRPC 端点,但此细节取决于您。

创建令牌获取端点

  1. 安装和初始化管理SDK

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

    // 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. 可选:设置时间生存(TTL),用于传递一个由自定义提供商发布应用程序检查令牌AppCheckTokenOptions反对createToken()您可以将 TTL 设置为 30 分钟到 7 天之间的任何值。设置此值时,请注意以下权衡:

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

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

下一步

现在,您已经实现自定义提供商的服务器端逻辑,学习如何从您的使用苹果安卓网页客户端。