了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

在自定义后端验证 App Check 令牌

您可以使用 App Check 来保护应用的非 Firebase 资源,例如自行托管的后端。为此,您需要执行以下两项操作:

  • 修改您的应用客户端,以将 App Check 令牌随每个请求一起发送到后端,如 iOS+AndroidWeb 对应的页面所述。
  • 按照本页所述,修改后端以要求将有效的 App Check 令牌随每个请求一起发送。

准备工作

如果您尚未安装 Node.js Admin SDK,请先安装。

验证令牌

如需在后端验证 App Check 令牌,请向 API 端点的处理程序添加以下逻辑:

  • 检查确认每个请求都包含 App Check 令牌。

  • 使用 Admin SDK 的 appCheck().verifyToken() 方法验证 App Check 令牌。

    如果验证成功,则 verifyToken() 会返回已解码的 App Check 令牌。成功的验证表示令牌来自属于您的 Firebase 项目的应用。

拒绝未通过任一检查的任何请求。例如,使用 Express.js 中间件:

const express = require('express');
const app = express();

const { initializeApp } = require("firebase-admin/app");
const { getAppCheck } = require("firebase-admin/app-check");
const firebaseApp = initializeApp();

const appCheckVerification = async (req, res, next) => {
    const appCheckToken = req.header('X-Firebase-AppCheck');

    if (!appCheckToken) {
        res.status(401);
        return next('Unauthorized');
    }

    try {
        const appCheckClaims = await getAppCheck().verifyToken(appCheckToken);

        // If verifyToken() succeeds, continue with the next middleware
        // function in the stack.
        return next();
    } catch (err) {
        res.status(401);
        return next('Unauthorized');
    }
}

app.get('/yourApiEndpoint', [appCheckVerification], (req, res) => {
    // Handle request.
});

重放攻击防范(Beta 版)

为保护端点免遭重放攻击,您可以在验证 App Check 令牌后消耗掉该令牌,即使其只能使用一次。

不过,启用重放攻击防范会增加 verifyToken() 调用的网络往返时间,因此进行该调用的端点的延迟也会更长。因此,我们建议您仅在特别敏感的端点上启用重放攻击防范。

如需消耗掉令牌,请将 { consume: true } 传递给 verifyToken() 方法。然后检查结果对象;如果 alreadyConsumed 属性为 true,请求将遭拒(您也可以执行一些纠正措施,例如要求调用方通过额外的检查)。

例如:

const appCheckClaims = await getAppCheck().verifyToken(appCheckToken, { consume: true });

if (appCheckClaims.alreadyConsumed) {
    res.status(401);
    return next('Unauthorized');
}

// If verifyToken() succeeds and alreadyConsumed is not set, okay to continue.

该脚本会验证令牌,然后将其标记为已消耗。之后对同一令牌调用 verifyToken(appCheckToken, { consume: true }) 会将 alreadyConsumed 设为 true。(请注意,如果未设置 consumeverifyToken() 不会拒绝已消耗掉的令牌,甚至不会检查它是否已被消耗。)

若要为特定端点启用此功能,还必须更新应用客户端代码,以获取可用于该端点的限定使用次数型可消耗令牌。请参阅适用于 Apple 平台AndroidWeb 的客户端文档。