在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
相关产品推荐
相关产品推荐

