跳转到内容
搜索文档

在 Google Firebase 中实现 Turnstile

最后更新 查看 MarkdownAgent 设置

Turnstile 在 Google 的 Firebase 平台上作为一个 App Check 提供程序以扩展的形式可用。您可以利用 Cloudflare Turnstile 的 bot 检测和质询功能,确保对您 Firebase 后端服务的请求得到验证,并且只有真实的真实访客才能与您的应用程序进行交互。

Google Firebase 是一个综合性应用程序开发平台,提供各种工具和服务来帮助开发者构建、改进和发展其移动和 Web 应用程序。

Firebase App Check 通过确保传入请求来自合法访问者和受信任的来源,来帮助保护 Firebase 资源(如 Cloud Firestore、Realtime Database、Cloud Storage 和 Functions)免受滥用(例如自动化欺诈攻击和拒绝服务 (DoS) 攻击)。

1. 设置 Google Firebase 项目

  1. 访问 Firebase 控制台 (Firebase Console) 创建 Firebase 项目。
  2. 选择 Add Project(添加项目) 并按照提示创建新项目。
  3. 通过选择您的项目在项目中添加一个应用 (app)。
  4. 在项目概述中,选择 Add App(添加应用) 并选择平台:Web
  5. 注册您的应用 (Register your app) 并按照指南获取您的 Firebase 配置。

2. 设置 Cloudflare Turnstile

  1. 访问 Cloudflare Turnstile 仪表板 创建 Cloudflare Turnstile 站点。
  2. 创建一个新的小组件并获取 sitekey 和密匙 (secret key)
    • 您为 Turnstile 小组件配置的域名应该是您的 Web 应用的域名。
    • 小组件模式必须是 Invisible(不可见)

3. 将 Firebase App Check 与 Turnstile 集成

3a. 在 Firebase 中启用 App Check

  1. 前往 Firebase Extensions 枢纽中的 Cloudflare Turnstile
  2. 将 Cloudflare Turnstile 扩展安装到您的 Firebase 项目中。
  3. 启用 Cloud FunctionsArtifact RegistrySecret Manager
  4. 输入来自 Cloudflare Turnstile 的密匙和您的 Firebase App ID。
  5. 选择 Install extension(安装扩展)

3b. 授予对 Cloudflare 扩展的访问权限

  1. 在您项目的 IAM 部分下,通过在 View by Principals(按成员查看) 下选择 Grant Access(授予访问权限),来授予对 Cloudflare 扩展的访问权限。
  2. 从下拉菜单中选择 ext-cloudflare-turnstile
  3. 过滤角色时,选择 Service Account Token Creator(服务账户令牌创建者)

3c. 在您的应用中使用 Turnstile 配置 Firebase

  1. 创建一个 index.ts 文件。

  2. 添加您的 Firebase 配置。

    import { initializeApp } from "firebase/app";
    import { getAppCheck, initializeAppCheck } from "firebase/app-check";
    import {
        CloudflareProviderOptions,
    } from '@cloudflare/turnstile-firebase-app-check';
    
    const firebaseConfig = {
    apiKey: "YOUR_API_KEY",
    authDomain: "YOUR_PROJECT_ID.firebaseapp.com",
    projectId: "YOUR_PROJECT_ID",
    storageBucket: "YOUR_PROJECT_ID.appspot.com",
    messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
    appId: "YOUR_APP_ID",
    };
    
    const app = initializeApp(firebaseConfig);
    
    // 初始化 App Check
    const siteKey = 'YOUR-SITEKEY';
    const HTTP_ENDPOINT = '${function:ext-cloudflare-turnstile-app-check-provider-tokenExchange.url}';
    
    const cpo = new CloudflareProviderOptions(HTTP_ENDPOINT, siteKey);
    const provider = new CustomProvider(cpo);
    
    initializeAppCheck(app, { provider });
    
    // 从 Cloudflare Turnstile 检索 App Check 令牌
    cpo.getToken().then(({ token }) => {
        document.getElementById('app-check-token').innerHTML = token;
    });

3d. 在您的 Web 应用程序中验证 App Check 令牌

要在您的 Web 应用程序中验证 App Check 令牌,请参阅 Firebase 的 令牌验证指南 (Token Verification guide)

import express from "express";
import { initializeApp } from "firebase-admin/app";
import { getAppCheck } from "firebase-admin/app-check";

const expressApp = express();
const firebaseApp = initializeApp();

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

    if (!appCheckToken) {
        res.status(401);
        return next("未授权");
    }

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

        // 如果 verifyToken() 成功,则继续执行堆栈中的下一个中间件函数。
        return next();
    } catch (err) {
        res.status(401);
        return next("未授权");
    }
}

expressApp.get("/yourApiEndpoint", [appCheckVerification], (req, res) => {
    // 处理请求。
});

这篇文档对您有帮助吗?