您可以使用 App Check 来保护应用的非 Firebase 资源,例如自行托管的后端。为此,您需要执行以下两项操作:
- 修改您的应用客户端,以将 App Check 令牌随每个请求一起发送到后端,如 iOS+、Android 和 Web 对应的页面所述。
- 按照本页所述,修改后端以要求将有效的 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
。(请注意,如果未设置 consume
,verifyToken()
不会拒绝已消耗掉的令牌,甚至不会检查它是否已被消耗。)
若要为特定端点启用此功能,还必须更新应用客户端代码,以获取可用于该端点的限定使用次数型可消耗令牌。请参阅适用于 Apple 平台、Android 和 Web 的客户端文档。