You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NextJS getServerSideProps中调用Firebase云函数时能否使用AppCheck?

在Next.js getServerSideProps中调用Firebase onRequest云函数时使用AppCheck的方案

可以使用Firebase AppCheck,它并非仅局限于客户端浏览器环境,服务器端场景同样支持,下面是具体实现方案:

1. 服务器端生成AppCheck令牌

通过Firebase Admin SDK可以直接生成AppCheck令牌,用于服务器发起的请求验证:

  • 首先安装Admin SDK:
    npm install firebase-admin
    
  • 在getServerSideProps中初始化SDK并生成令牌,注意避免重复初始化:
    import admin from 'firebase-admin';
    
    // 确保Admin SDK仅初始化一次
    if (!admin.apps.length) {
      admin.initializeApp({
        credential: admin.credential.applicationDefault(),
      });
    }
    
    export async function getServerSideProps(context) {
      // 传入你的Firebase App ID生成令牌
      const appCheckToken = await admin.appCheck().createToken('your-app-id');
    
      // 调用onRequest云函数,在请求头携带令牌
      const cloudFunctionRes = await fetch('your-cloud-function-url', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-Firebase-AppCheck': appCheckToken.token,
        },
        body: JSON.stringify({ /* 请求数据 */ })
      });
    
      const data = await cloudFunctionRes.json();
    
      return { props: { data } };
    }
    

2. 配置云函数的AppCheck验证

需要在onRequest云函数中启用AppCheck验证,确保只有携带有效令牌的请求能通过:

  • V2版本云函数:可以直接通过配置启用强制验证
    const { onRequest } = require("firebase-functions/v2/https");
    const { initializeApp } = require("firebase/app");
    const { getAppCheck } = require("firebase/app-check");
    
    const firebaseApp = initializeApp({ /* 你的Firebase配置 */ });
    getAppCheck(firebaseApp);
    
    exports.yourFunction = onRequest({ enforceAppCheck: true }, (req, res) => {
      // 云函数业务逻辑
      res.json({ message: "请求验证通过" });
    });
    
  • V1版本云函数:需要手动验证令牌
    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    
    admin.initializeApp();
    
    exports.yourFunction = functions.https.onRequest(async (req, res) => {
      const appCheckToken = req.get('X-Firebase-AppCheck');
      if (!appCheckToken) {
        res.status(401).send('缺少AppCheck令牌');
        return;
      }
    
      try {
        await admin.appCheck().verifyToken(appCheckToken);
      } catch (err) {
        res.status(403).send('无效的AppCheck令牌');
        return;
      }
    
      // 云函数业务逻辑
      res.json({ message: "请求验证通过" });
    });
    

3. 注意事项

  • 确保Admin SDK使用的服务账号拥有firebase.appCheck.tokenCreator权限,否则无法生成令牌。
  • 生成的令牌默认有效期1小时,可通过createToken方法的expiresIn参数自定义时长。
  • 在Next.js中初始化Admin SDK时,必须判断admin.apps.length,避免重复初始化导致报错。

内容的提问来源于stack exchange,提问作者Jay B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:15:56