如何保障对接Firebase的Next.js API安全,避免会员权限被恶意篡改
基于Next.js + Firebase的会员权限API安全改造方案
核心问题诊断
你原流程的核心风险是接口未做身份校验、未校验操作合法性,任何人只要拿到接口地址,传入任意用户邮箱就能修改其会员等级,属于完全未设防的状态。
具体落地实现
- 第一步:接入Firebase Auth ID Token做身份校验,不需要自研令牌体系
所有客户端(Web/React Native)调用接口时,必须在请求头携带当前登录用户的ID Token,格式为Authorization: Bearer <你的ID Token>,Web端通过Firebase Auth的currentUser.getIdToken()方法获取,React Native端通过react-native-firebase库的同名方法获取,两端逻辑完全一致。
Next.js API侧用Firebase Admin SDK校验Token合法性,直接从校验通过的Token中取用户uid,完全不要信任客户端传入的email/uid参数,避免越权修改他人账号信息,示例代码如下:// pages/api/update-premium.ts (App Router写法逻辑相同) import admin from '@/lib/firebase-admin'; // 提前初始化好admin SDK import type { NextApiRequest, NextApiResponse } from 'next'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method !== 'POST') return res.status(405).json({ msg: '不支持的请求方法' }); // 提取请求头的Token const authHeader = req.headers.authorization; if (!authHeader?.startsWith('Bearer ')) return res.status(401).json({ msg: '未授权访问' }); const idToken = authHeader.split(' ')[1]; try { // 校验Token合法性,过期、伪造的Token会直接抛出错误 const decodedUser = await admin.auth().verifyIdToken(idToken); const operateUid = decodedUser.uid; // 操作人uid,从Token取,不相信客户端传参 // 后续业务逻辑 } catch (err) { return res.status(401).json({ msg: '身份校验失败' }); } } - 第二步:补充操作合法性校验,禁止客户端直接指定会员等级修改
会员等级的修改只能通过3个可信触发源,禁止前端直接传目标等级调用接口:- 支付成功回调:用户点击升级按钮后先走支付流程,支付平台异步通知你服务端支付成功,你再根据回调里的用户信息修改对应账号的会员等级,该回调接口你自行配置签名校验,不对外暴露
- 定时自动降级:会员到期自动降级的逻辑放在服务端定时任务中执行,完全不提供对外调用接口,避免被恶意触发
- 管理员后台操作:如果有手动改等级的需求,单独给管理员账号加Firebase自定义声明,接口校验Token中存在
admin: true的声明才允许操作
- 第三步:新增Firestore安全规则兜底
即使API层出现漏洞,Firestore层面也拦截非法修改,规则示例:
该规则会拦截所有普通用户直接修改premium字段的请求,只有你的服务端Admin SDK(默认跳过安全规则)可以修改该字段。rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{uid} { // 普通用户只能读自己的数据,不能修改premium字段 allow read: if request.auth != null && request.auth.uid == uid; allow update: if request.auth != null && request.auth.uid == uid && !("premium" in request.resource.data); } } }
额外加固建议
- 接口增加请求频率限制,同一个uid1分钟内最多调用3次相关接口,避免恶意批量试探
- 所有会员等级变更操作留痕,单独存储操作日志,记录操作时间、操作人uid、修改前后等级、操作触发源,方便后续溯源
- 敏感操作可以额外加短验证码校验,比如降级操作要求用户输入短信验证码确认后再执行
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

