如何配置Nginx仅接受特定React Native应用的请求?
限制Node.js后端仅接受React Native(Expo)应用请求的方案
1. 结合应用签名验证与请求加密校验
单纯靠自定义请求头确实容易被伪造,推荐把Expo应用的唯一标识(签名/包名)和请求加密结合起来,提升安全性:
- 在Expo项目里用
expo-application库获取应用的唯一标识:import * as Application from 'expo-application'; import { Platform } from 'react-native'; const getAppAuthInfo = async () => { if (Platform.OS === 'android') { // 获取Android应用签名哈希 return await Application.getAndroidSignatureHashes(); } else if (Platform.OS === 'ios') { // 返回iOS包名 return Application.iosBundleIdentifier; } return null; }; - 发起请求时,带上三个自定义头:
X-App-Auth-Info: 上面获取的应用标识X-Request-Timestamp: 当前时间戳(毫秒)X-Signature: 用后端预先约定的密钥,对时间戳+应用标识做HMAC-SHA256加密后的字符串
- 后端处理逻辑:
- 先校验时间戳是否在5分钟内,防止重放攻击
- 用相同密钥对请求里的时间戳+
X-App-Auth-Info做加密,和X-Signature对比,不匹配直接拒绝 - 校验
X-App-Auth-Info是否是你应用的合法标识
2. 客户端凭证式的OAuth2.0验证
把你的RN应用当作一个OAuth客户端,通过短期凭证来授权:
- 后端生成一对客户端ID和密钥(只在你的应用和后端之间留存)
- Expo应用启动后,调用后端的
/auth/client-token接口,用客户端ID和密钥换取有效期1小时左右的access token - 后续所有请求都在请求头里带上
Authorization: Bearer <token> - 后端验证token的签名、有效期,合法才允许访问
- 注意:客户端密钥别硬编码在前端,用Expo的
app.config.js结合环境变量注入,避免反编译泄露:// app.config.js export default { expo: { extra: { clientId: process.env.CLIENT_ID, clientSecret: process.env.CLIENT_SECRET } } };
3. 限流措施解决频繁请求问题
不管是不是合法应用请求,都要限制请求频率,防止恶意刷接口:
- 如果用Express框架,直接用
express-rate-limit中间件:const rateLimit = require('express-rate-limit'); const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟窗口 max: 100, // 单IP最多100次请求 message: '请求过于频繁,请稍后再试' }); // 给所有接口应用限流 app.use('/api/', apiLimiter); - 针对已登录用户,可以基于用户ID限流,比IP更精准。
4. 健康检查路由的特殊处理
健康检查路由不用做严格的应用身份校验,但也要加上限流,避免被用来发起DDoS攻击。
内容的提问来源于stack exchange,提问作者Mike K
相关产品推荐
相关产品推荐

